我的语法如下:
SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
NAME_TAG : 'name';
IS_TAG : 'is';
START : 'START';
END : ('END START') => 'END START' ;
WORD : 'A'..'Z'+;
rule : START NAME_TAG IS_TAG WORD END;
并且想要解析像“START name是END START”这样的语
我已经为计算表达式编写了一个非常简单的语法定义:
grammar SimpleCalc;
options {
output=AST;
}
tokens {
PLUS = '+' ;
MINUS = '-' ;
MULT = '*' ;
DIV = '/' ;
}
/*------------------------------------------------------------------
* LEXER RULES
*--------
我正在编写语法来解析日志文件,如下所示:
V9013_MURGIN_AE_7340057[01/10/2013 10:07:33]:DEBUG:<PCDATA>
V9013_MURGIN_AE_7340057[01/10/2013 10:07:33]:DEBUG:<PCDATA>
etc...
V9013_MURGIN_AE_7340057[01/10/2013 10:07:33]:调试:
V9013_MURGIN_AE_7340057[01/10/2013 10:07
我想匹配以下输入:
statement span=1m 0_dur=12
使用以下语法:
options {
language = Java;
output=AST;
ASTLabelType=CommonTree;
}
statement :'statement' 'span' '=' INTEGER 'm' ident '=' INTEGER;
INTEGER
: DIGIT+
;
ident : IDENT | 'AVG' | 'COUNT';
IDENT
:
我正在尝试修复我的TreeWalker,以便它可以根据是否找到括号实现不同的字符串模板
i、 e.在以下公式中:x-y-z
使用括号将更改公式的值。如果没有括号,公式将变成x-y-z,这是错误的。我试图使用一个不同的字符串模板来表示负号和带括号的负号。详情如下:
minus(op1,op2) ::= "$op1$ - $op2$"
minusb(op1,op2) ::= "($op1$ - $op2$)"
下面是我尝试使用的TreeWalker
我可以让我的侦听器响应我自己的访问者吗?我想我发出了一个嘘声,不必要地将我的应用程序代码放在我的子类访问者中。
我现在认为访问者应该只访问,我的侦听器应该在我的应用程序代码中触发事件。
我想我的实现有点混乱 当然。您可以创建您想要的任何侦听器接口,然后创建一个向您的侦听器触发事件的访问者。然而,这是相当低效的。只要甩了你的访问者,让标准的tree walker fire事件发生在你的侦听器上:)谢谢Terence,我开始意识到使用我的访问者是完全多余的,因为对于侦听器,我仍然可以在解析树中向
标签: Antlr
nodesabstract-syntax-tree
我正在创建我的第一个AST。我想从中删除“=”
我有点像:
BLOCK
|
|-----------|
STATEMENTS RETURN
|
ASSIGNMENT
|
|
|-----|-----|
field = value
An extract from my Grammar file:
pars
我创建了一个示例grammar TestGrammar.g4来说明我的问题:
grammar TestGrammar;
Member_of : 'MEMBER OF';
Identifier : [a-z]+
;
WS: [ \n\t\r]+ -> channel(HIDDEN);
parseSimpleExpression : (Identifier '.')+ Identifier
;
collection_m
我正在为输入创建一个解析器,如下所示:
FirstName, LastName, Street, City, State, ZipCode
Mark,, 4460 Stuart Street, Marion Center, PA, 15759
----
FirstName=John
LastName=Smith
-分隔符前面的数据是CSV格式,而-分隔符后面的数据是键/值格式。所以我有两组lexer规则,我使用ANTLR模式在lexer规则之间切换
问题是:我需要一个lexer规则来处理两组l
我有一个用Antlr编写的类似SQL的语法,我在操作符中遇到了问题。示例查询/输入(在子句中没有)如下所示
select sum(sum(sum.........N)) from table where sum(sum(sum....N)) = 10
这是语法规则中的
inOperator:
expression IN (valueList | query)
| expression;
这里,表达式也是另一条规则,这非常复杂。它的层次相对较深。现在的问题是,当我的解析器达到这个规则
当我试图解析vCard之类的东西时,当我设置一个令牌从输入中将名字读为“FN”时,我无法使用getText();方法。因为getText()之前的表达式;必须从一开始就与表达式相同
| Firstname {System.out.println("First Name : " +$Letters.getText());}
| Letters
Firstname: 'FN';
Letters: [A-Za-z0-9-]+;
vCard code:
BEGI
我正在用ANTLR创建一个DSL,我想定义以下语法
// study without parameters
study()
// study with a single parameter
study(x = 1)
// study with several parameters
study(x = 1, x = 2)
在我的语法中,它允许以下输入:study(x=1x=2)
您的语法允许学习(x=1x=2)因为assign*匹配x=1x=2。如果您不想允许这样的输入,您应该删除assign
我正在使用Antlr3创建一个AST。我想要两个AST分析器,一个用于生产代码,另一个用于我们已经拥有的Eclipse插件。然而,插件并不需要树中的所有信息。我要寻找的是一种在语法中不指定所有分支的情况下解析树的方法。有办法吗?我不知道您到底想做什么,但上次遇到这个问题时,我在树漫游器中设置了一个布尔标志。例如:
@members
{
boolean executeAction = true;
}
...
equation:
@init{
if(executeAction){
标签: Antlr
antlr3context-free-grammar
有没有办法为ANTLRv3生成的解析器和Lexer类指定自定义类名(意思是独立于语法名)
那么在
grammar MDD;
//other stufff
它会自动将MDDParser和MDDLexer装箱,但我希望将它们作为MDDBasperser和MDDLexer。否,在类似MDD的组合语法中,解析器和词法分析器被命名为MDDParser和MDDLexer。组合语法是一种不指定类型的语法(parser或lexer)
您可以定义一个单独的解析器和词法分析器语法:
// put this in
我需要为具有正向引用的语言创建语法。我认为实现这一点最简单的方法是对生成的AST进行多次传递,但我需要一种在树中存储符号信息的方法
现在,我的解析器正确地生成AST并计算变量和函数定义的范围。问题是,我不知道如何将范围信息保存到树中
我的语法片段:
composite_instruction
scope JScope;
@init {
$JScope::symbols = new ArrayList();
$JScope::name = "level "+ $JScope.siz
我的ANTLR代码如下:
LPARENTHESIS : ('(');
RPARENTHESIS : (')');
fragment CHARACTER : ('a'..'z'|'0'..'9'|);
fragment QUOTE : ('"');
fragment WILDCARD : ('*');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C'|';'|':'|',');
WILD_STRING
: (CHA
我定义了以下语法
grammar Sample_1;
@header {
package a;
}
@lexer::header {
package a;
}
program
:
define*
implement*
;
define
: IDENT '=(' INTEGER',' INTEGER ')'
;
implement
:IDENT '=(' (IDENT ','?)* ')'
我想在ANTLR3中实现一个“分支”
我想用
branch[boolean is_a]
: ({ $is_a}? => a)
| ({!$is_a}? => b);
我会这样做,但我得到编译错误“找不到符号”和“类型的非法开始”,因为在生成的源代码中,即DFA45.SpecialStateTransfition(…)没有参数是a
我试着省略=>和/或省略$的$
第一组a和b不是不相交的
事实上,b属于((C)=>C)| a
因为我不明白{…}?=>之间的区别和{…}
标签: Antlr
grammardollar-sign
我一直在关注这家伙的教程(http://vimeo.com/groups/29150/videos/8137747),他们是伟大的;唯一的问题是,当我像他一样在语法文件中使用“$”符号时,我会出错,语法无法编译
例如,我不能使用($channel=HIDDEN)
我一步一步地遵循他的指导。有人有同样的问题吗?您不应该使用括号,而应该使用括号,并且应该用分号终止该语句。所以它不是:
($channel = HIDDEN)
但是:
{$channel = HIDDEN;}
标签: Antlr
antlr3tree-grammar
我读过很多书,试图找到一种干净地使用ANTLR树语法中的列表的方法。以下是我的尝试和结果(我真的希望我错过了一些琐碎的东西)
使用+=语法
program returns [someInterface result]
: m+=method* EOF {result = new SomeClass(m);};
method returns [SomeMethod result] : <definition here>
这似乎是可行的,尽管我承认我还没有用嵌套/递归案例测试它
如果我有这样的语法规则
a: A (C|D|E)
a: (A|B) (C|D|E)
我可以通过为每个备选方案(C、D、E)附加重写规则为规则创建AST,如下所示:
a: A (C -> ^(A C)
| D -> ^(A D)
| E -> ^(A E))
a: (A|B) (C|D|E) -> ^((A|B) (C|D|E))
但是,如果我有另一个稍微不同的语法规则,比如
a: A (C|D|E)
a: (A|B) (C|D|E)
如何为每个
当语法允许非关键字具有与关键字相似的“外观”时,我很难区分关键字和非关键字
语法如下:
grammar Query;
options {
output = AST;
backtrack = true;
}
tokens {
DefaultBooleanNode;
}
// Parser
startExpression : expression EOF ;
expression : withinExpression ;
withinExpression
: default
标签: Antlr
grammarantlrworks
我有这样一个ANTLR语法:
grammar HelloGrammar1;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;
STATEMENT : 'hello' ID ';' ;
WS : (' '|'\t'|'\r'|'\n')* ;
我想让它解析以下文本:hello qwerty。这样不行。如果我将字符串更改为helloqwerty,一切正常。我还可以将语法更改为:
grammar Hello
我为字符串变量声明编写了以下语法。字符串的定义类似于单引号之间的任何内容,但必须有一种方法通过使用$字母转义来向字符串值添加单引号
grammar test;
options
{
language = Java;
}
tokens
{
VAR = 'VAR';
END_VAR = 'END_VAR';
}
var_declaration: VAR string_type_declaration END_VAR EOF;
string_
标签: Antlr
antlr3antlrworkssql-parser
我是新来的ANTLR&语法写作。我的要求是解析insert/update/deleteSQL查询,以获得详细信息,如更新/插入/删除行的表、列列表及其值等。是的,有一个很好的ANTLR文档,但是,如果有人能帮助我使用查询解析的特定语法,那将是非常有帮助的。Wiki上有各种SQL语法:
但要小心:它们是由ANTLR用户提供的,很可能它们没有经过适当的测试和/或包含bug
但是为什么要自己生成SQL解析器呢?使用一些现有的SQL解析器可能会更容易。只要在“SQL解析器Java”上搜索一下(假设您正在
标签: Antlr
interpreterantlrv3ide
以下语法成功地生成了一个解析器,用于处理字符串'ccdunion'。但是当我尝试使用解释器时,我出现了NoViableAltException错误,为什么
grammar SimpleCalc;
options {
k = 2;
output = AST;
backtrack = true;
}
tokens {
UNION = 'union';
}
@header {
package myPack;
import java.io.File;
import j
我将错误标签分配给非集合的块。我的标签出现此错误:child、left、right、first和last。我所做的是给一组备选方案分配一个标签;这难道不应该得到支持吗
我的语法片段:
expr:
unaryExpr '(' child=(stat | expr | NUMBER) ')' #labelUnaryExpr
| binaryExpr '(' left=(stat | ex
如何编写接受任意顺序的可选参数和必需参数的混合的ANTLR规则
例如,一个有效的查询可能看起来像函数(a=5,c=“foo”,b=21)或函数(b=4,c=5),其中a是可选的,但c和b是必需的。唯一有效的参数是a、b和c
任何帮助都将不胜感激。这不是您在语法中定义的内容。语法只接受函数(a=5,c=“foo”,b=21)和函数(a=5,c=“foo”,i=21)。解析输入后,您将在遍历解析树时拒绝后一个示例
例如,以a的BNF规范为例:
其中Expression1很可能是变量Q,定义如下:
f
标签: Antlr
abstract-syntax-treefunction-call
一旦构建了AST,实现tree walker的最佳方式是什么,以便可以以任何顺序定义和调用函数
例如,这在PHP中是有效的:
<?php
f(); // function called before it’s defined
function f() {
print 3;
}
?>
我猜一定有第二个过程,或者是一个树转换,但是我在这个主题上找不到任何有趣的东西。这个问题可能不是Antlr特有的,但是如果你能给我举一个Antlr的例子来说明如何做到这一点,那就更好了 是的,你
我计划为专有语言构建一个静态分析器工具。我计划使用ANTLR来构建AST。我想知道如何检查项目使用AST的专有语言设置的规则和指南
例如,如果我为C源代码构建AST,并说我想检查空指针。如何使用AST或CST进行此检查
我是否必须使用ANTLR生成的lexer/parser?在测试中编码
谢谢这取决于您要执行的具体分析。以您的特定示例为例:为了静态地确定变量是否可能是(或将是)空指针,您需要构造一个。我建议您学习。如果您想检查空指针值,您需要对您的专有语言进行完全控制和数据流分析。如果你不付出超
我不确定问题是否真的是前缀的问题,但问题是
我的语法中有这两条规则(除其他许多规则外)
DOT:';
和"和","和",;
我需要像这样解析字符串:
a.eq.b.and.c.ne.d
c.append(b)
NUMBER_T
: DIGIT+ ((DECIMAL)=> DECIMAL ((KIND)=> KIND)?)?
;
fragment DECIMAL : '.' DIGIT+;
fragment KIND : '_' (ALPHA+ | DIGIT+); /
我的语法不接受“x=4,xy=1”这样的输入
我该怎么做才能让它接受大量的输入,比如ID=NUMBER??
提前谢谢。您必须解释语法中的逗号“”、“”。此外,由于您(很可能)不希望创建字母和数字标记,因为它们仅在其他lexer规则中使用,因此您应该:
非常感谢你。我没有考虑逗号,我将检查片段是什么。
grammar Ex5;
prog : stat+;
stat : ID '=' NUMBER;
LETTER : ('a'..'z'|'A'..'Z');
DIGIT : ('0'..'9')
我正在尝试编写一个简单的lambda演算语法(如下所示)。我遇到的问题是,函数应用程序似乎被视为右关联而不是左关联,例如,“f1 2”被解析为(f(12))而不是((f1)2)。ANTLR有一个令牌的assoc选项,但我不认为这有什么帮助,因为函数应用程序没有操作符。有人看到解决办法了吗
LAMBDA : '\\';
DOT : '.';
OPEN_PAREN : '(';
CLOSE_PAREN : ')';
fragment ID_START : [A-Za-z+\-*/_];
fragme
Antlr4生成的代码是否包含类似于可以使用语法和解析器树来重建原始源代码的解析器的内容?如果它存在,我将如何调用它?我之所以这么问,是因为它在某些应用程序和调试中可能很有用。这取决于您想要实现什么。请记住,Lexer标记放在隐藏通道上(如注释和空格),并且根本不进行解析。
方法一 过去是
在lexer令牌类中使用其他特定于用户的信息
解析源代码并获取AST
倒带lexer(令牌源)并在所有Lexem上循环,包括隐藏的Lexem
对于每个隐藏的词素,将引用附加到相应的AST 叶子
因此,每个A
我在AntlrWorks 1.4.3下使用Antlr 3,我在编写忽略注释行的语法时遇到困难
这就是问题所在的语法:
grammar Ex2;
@header {
import java.util.HashMap;
}
@members {
HashMap memory = new HashMap();
}
prog: stat+ ;
stat
: expr NEWLINE {System.out.println($expr.value);}
| ID '='
我对ANTLR和语法有相当的理解。说ANTLR可以进行源语言到目标语言的转换,比如ASP到JSP或COBOL到JSP,对吗?如果是的话,你能帮我提供一些信息/教程/链接到浏览器的可能性吗
其思想是使用ANTLR实用地将大量代码从源代码翻译到目标代码
感谢在Antlr4中构建翻译器的基本步骤是:
从源语言中的输入文本生成解析树
反复遍历解析树以分析解析树的节点,添加并改进与单个解析树节点相关联的属性(装饰器模式)——这些属性将描述用目标语言表示节点内容所需的更改
解析树的最后一步,以收集和输出目标
为了突出显示,我需要能够将一个令牌拆分为2个,我有一个如下所示的令牌:
ID_INTERP: '$' IDEN;
但是我想突出显示与标识符不同的美元符号,那么是否可以将此令牌分成两部分,一部分带有美元符号,另一部分带有标识符?我知道我可以在某些条件下将整个令牌更改为不同的类型,但我希望能够添加和更改它包含的文本,基本上是更改令牌流,而不是说
ID_INTERP[“$foo”]
它会看到这样的情况:
ID_INTERP: '$' IDEN;
美元符号[“$”]IDEN[“foo”]通过扩展令牌
ANTLR是否可以使用StringTemplate或我希望它喜欢的任何文本输出C,还是只输出到java?从我所看到的示例来看,它似乎是一个非常以java为中心的工具。您可以从中下载最新的源代码作为tar文件。C运行时二进制文件也可以直接使用
您正在寻找哪种解决方案?您可以从下载最新的源代码作为tar文件。C运行时二进制文件也可以直接使用
您正在寻找哪种解决方案?ANTLR IDE提供了一个选项,您可以通过该选项在Java和C代码生成之间切换
更好的方法是查阅本文的“指定代码生成”部分:
ANTL
我看到一些C的main()示例四处浮动,例如和
取消引用似乎是错误的。我不知道那是什么,请原谅,如果我能避免的话,我不想这样做
我只想定义lexer和grammar(用于modem AT命令),并自动生成main()或从某处剪切/粘贴
有一点小小的变化是,大多数示例似乎都是从文件中读取的,而我将以字符串的形式获取一系列输入(AT命令),并作为参数传递
有人能给我指一个简单的main()吗?我可以修改它(也许建议hwo修改它?)有很多问题要问,我知道,对不起 AST是一个“抽象语法树”,对于AT命
标签: Antlr
tokenrulesantlr3
我正试图编写一个语法来进行解析,之后(不幸的是,an在antlr3中不起作用)
我现在的问题是,当我已经在斜体规则中时,能够捕获一个粗体规则,或者反之亦然。比如说
'' this text is bold '''now it's italic''' and just bold again''
我得到了很多朋友的帮助,但我被困住了。我们的目标是使用操作或AST在语法中生成HTML—我不确定哪一个是最好的。作为练习,我还创建了一个MediaWiki解析器,没有匹配粗体和斜体的打开和关闭标记,而是调
我试图找出以下语法的语法
foreach
where x = 1 when some_variable = true
where x = 2 when some_variable = false
where y = 0
print z // Main block
when none // optional
print 'not found' // Exception b
我正在尝试开发一种语法来使用ANTLR4解析DSL(第一次尝试使用它)
语法本身在某种意义上类似于SQL,应该
它应该能够解析如下命令:
select type1.attribute1 type2./xpath_expression[@id='test 1'] type3.* from source1 source2
fromDate 2014-01-12T00:00:00.123456+00:00 toDate 2014-01-13T00:00:00.123456Z
where (type1
我正在为ANTLR中的语法编写解析器。我目前正在研究()的优先级最高的表达式,然后是一元负号,等等
当我添加行ANTLR时,给出了一个错误:以下规则集是相互左递归的[add、mul、一元、not和、expr、paren、accessMem、relation或assign、equal],我如何着手解决这个问题?提前谢谢 最简单的答案是使用antlr4而不是3,这对立即左递归没有问题。它会自动重写封面下的语法,以便做正确的事情。有很多例子。例如,你可以查看上的或我的小博客条目。如果您坚持使用v3,那
我正在用grun测试一些语法,我没有看到我的标记被识别为标记。我最初认为也许我已经基于此创建了“隐式”标记
此外,在查看grun-token的输出时,我发现了以下链接:
1) 最近到-令牌输出。
2) 可能已经过时了,我已经用叉子叉好了,正在深入研究
下面是我的简单HelloTC.g4,我将在其中探讨:
grammar HelloTC;
r : HELLO id;
WS : [ \r\t\n]+ -> skip ;
CMD: '%';
DIR: '%%';
A: 'A';
AA:
我有这样一个简单的语法:
grammar Test;
generator : expression;
expression
: NUMBER # Number
| ID # String
| expression '+' expression # Add
;
NUMBER: [0-9]+ [0-9]*;
ID : [a-zA-Z_]+ [a-zA-
标签: Antlr
grammarmodularityrule
是否可以从不同的语法调用规则
目的是在同一个文件中有两种语言,第二种语言以(begin…)开头,其中。。。英语是第二语言。语法应该调用另一个语法来解析第二种语言
例如:
grammar A;
start_rule
: '(' 'begin' B.program ')' //or something like that
;
你的问题可以(至少)用两种方式来解释:
将大语法中的规则分成不同的语法
在“主”语言(孤岛语法)中解析单独的语言
我想这是第一次,在这种情况下,你
下面是一个非常简单的语法:
grammar test;
DIGIT : [0-9] ;
WS : [ \r\n\t]+ -> skip ;
value : DIGIT+ ;
grun test value -tokens
在OSX和JAVA版本1.6下使用antlr v4.0b3
使用以下命令编译语法:
antlr4 test.g4
javac *.java
然后我用grun测试语法:
grammar test;
DIGIT : [0-9] ;
WS : [ \r\n\t]+ -
弹性:
“r/s”
一个“r”,但仅当它后面跟着一个“s”。在确定此规则是否为最长匹配时,将包含由“s”匹配的文本,但在执行操作之前将返回到输入。因此,该操作只能看到与“r”匹配的文本。这种类型的模式称为跟踪上下文。(flex无法正确匹配某些“r/s”组合。请参阅限制,了解危险的尾随上下文。)
如何在ANTLRv4中实现这一点?我主要通过两种方式实现这一点
第一个涉及一个简单的语义谓词
'r' {_input.LA(1) == 's'}?
第二种方法要复杂得多,需要在匹配后重置输入流位置,其中
因此,我正在编写一种小型语言,并使用antlrv4作为我的工具。在编译语法文件(.g4)时,Antlr会自动生成lexer和parser文件。我使用的是javac btw。我希望我的语言没有分号,我希望这样做的方式是:如果有一个标识符或“)”作为行中的最后一个标记,lexer将自动放置分号(类似于“go”语言所做的)。我将如何处理这样的事情?在lexer文件中还有其他一些东西,比如ATN(我认为是增强的过渡网络)和dfa(我认为是确定性有限自动机),我不理解它们与lexing过程的关系?。感谢您
我是新来的,在ANTLR也是新来的。我很长一段时间都在犯这个错误,我找不到原因。请帮帮我
错误(208):MPL.g:16:1:无法匹配以下令牌定义,因为先前的令牌与相同的输入匹配:CHAR、IF、ELSIF、ELSE、THEN、PRINT
grammar mpl;
INT : ('0'..'9')+;
FLOAT: ('0'..'9')+ '.' ('0'..'9')*;
INTEGER : 'int';
FLOT : 'float';
CHARAC : '
1 2 3 4 5 6 ...
下一页 最后一页 共 19 页