我正在用ANTLR和ANTLRWorks 2创建我的第一个语法.我主要完成了语法本身(它识别用所描述的语言编写的代码并构建正确的解析树),但我还没有开始做任何事情.
令我担心的是,解析器规则中每个第一次出现的令牌都带有下划线,并带有"解析器规则中的隐式令牌定义".
例如,在此规则中,'var'具有波形:
variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
Run Code Online (Sandbox Code Playgroud)
它看起来如何:

奇怪的是,ANTLR本身似乎并不介意这些规则(在进行测试装备测试时,我在解析器生成器输出中看不到任何这些警告,只是在我的机器上安装了不正确的Java版本),所以这只是ANTLRWorks的抱怨.
是担心还是应该忽略这些警告?我应该在词法分析器规则中明确声明所有令牌吗?官方圣经"定义ANTLR参考"中的大多数exaples 似乎完全按照我编写代码的方式完成.
ANTLRWorks2中的TestDriver似乎有点挑剔,它什么时候会接受没有和明确的语法EOF,什么时候不接受.ANTLR4入门指南中的Hello语法不会在任何地方使用,因此我推断如果可能的话,最好避免显式.EOFEOF
使用的最佳做法是EOF什么?你什么时候需要它?
我正在使用ANTLR来解析我正在编写的Java工具中的逻辑表达式,并且我遇到了问题,因为将无效的输入字符串传递给生成的ANTLR词法分析器并且解析器不会导致任何异常.生成的文件不是像我期望的那样抛出RecognitionException,而是将错误消息打印到控制台并返回,好像没有发生错误,导致我的程序在以后遇到空数据时崩溃.
我使用ANTLRWorks版本1.4.3生成文件,似乎应该有某种选项让它实际抛出错误而不是打印到控制台,但我还没有找到任何东西.有谁知道如何让ANTLR实际抛出错误信息?我看到使用旧版本的ANTLR解决了C#中的同样问题,这是我需要做的吗?
编辑:在Bart指出我正在寻找的方向后,我找到了这个页面
https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
其"错误处理"部分的代码完全符合我的要求.要更改ANTLR捕获异常的方式,可以在语法文件中说明:
@rulecatch {
catch (RecognitionException e) {
throw e;
}
}
Run Code Online (Sandbox Code Playgroud)
这迫使ANTLR抛出异常而不是处理它并恢复.该部分还有一些关于覆盖不匹配和恢复功能的内容,以确保抛出所有可能的异常.
对于一个宠物项目,我开始摆弄ANTLR.在完成一些教程后,我现在正在尝试为我自己的语言创建语法并生成AST.
现在我主要在ANTLRWorks中乱搞,但现在我已经验证了解析树看起来很好我想(迭代地,因为我还在学习并且仍然需要对最终结构做出一些决定)树)创建AST.似乎antlrworks不会将其可视化(或者至少不使用"Interpreter"功能,Debug不能在我的任何机器上运行).
底线:是以手动方式可视化AST的唯一方法,遍历/显示它还是以字符串表示形式将树打印到控制台?
我正在寻找的是从输入,语法 - >视觉AST表示到ANTLRWorks的"解释器"功能的简单方法.有任何想法吗?
我使用ANTLRv3IDE插件已经使用ANTLR和Eclipse一段时间了.虽然它并不完美,而且有点过时,但它的工作做得相当不错.
现在我希望切换到ANTLRv4用于我正在创建的另一个DSL.但是,Eclipse支持似乎非常薄.我决定尝试一个NetBeans插件的ANTLRWorks,但是我无法安装它(它似乎被锁定到特定的日期版本(201302132200,而我有更新的东西,仍然是文档说的7.3)依赖项).
所以,问题是:有没有人设置任何 Java IDE(最好是Eclipse,但我可以被说服切换,如果支持对其他东西有好处)与ANTLR集成?使用集成,我的意思是:代码生成保存/键盘快捷方式和语法着色(至少).代码完成和其他功能当然很好,但我现在可以没有它们.
我很清楚Xtext,我在一些项目中使用它非常成功,但遗憾的是它不适合这里的需求(不需要IDE支持,需要我自己的DSL模型不基于ECore等).
我知道ANTLRWorks可以在没有Java IDE的情况下作为独立应用程序运行,但我认为这是最后的解决方案,因为以这种方式工作非常麻烦(在应用程序之间切换,文件不同步,没有VCS支持等) .我尝试了另一种方法:将Java部件安装到ANTLRworks(它本身就是一个NetBeans发行版)中,但它并没有很好地结束(似乎基本的项目支持等被从ANTLRworks中删除).
我为类似Java的DSL编写了一个语法.虽然它仍然存在一些问题(它不能像我希望的那样识别所有输入),但最让我担心的是生成的C代码是不可编译的.
我使用AntlrWorks 1.5和Antlr 3.5(Antlr 4显然不支持C目标).
问题在于表达规则.我有规则prio14Expression到prio0Expression,它处理运算符优先级.问题是优先级2,它评估前缀和后缀运算符:
...
prio3Expression: prio2Expression (('*' | '/' | '%') prio2Expression)*;
prio2Expression: ('++' | '--' | '!' | '+' | '-')* prio1Expression ('++' | '--')*;
prio1Expression:
prio0Expression (
('.' prio0Expression) |
('(' (expression (',' expression)*)? ')') |
('[' expression (',' expression)* ']')
)*;
prio0Expression:
/*('(') => */('(' expression ')') |
IDENTIFIER |
//collectionLiteral |
coordinateLiteral |
'true' |
'false' |
NUMBER |
STRING
;
...
Run Code Online (Sandbox Code Playgroud)
表达式是prio14Expression的标签.你可以在这里看到完整的语法.
代码生成本身是成功的(没有任何错误或严重警告).它生成以下代码:
CONSTRUCTEX();
EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
EXCEPTION->name = (void …Run Code Online (Sandbox Code Playgroud) ANTLR用法的推荐模式是让Parser构造一个抽象语法树,然后构建Tree walker(AKA树语法)来处理它们.
我试图深入了解为什么我的树语法不起作用,并且喜欢使用ANTLRWorks的调试器,就像我将它用于解析器本身一样.解析器的输入是"源代码",但树解析器的输入是解析器的AST结果.我不知道如何使其可用作测试树语法的输入.
目前尚不清楚是否有办法在ANTLRWorks中测试树语法.如果可以做到,那么正确的方向指针将非常受欢迎.
我试图让我的头围绕ANTLR中的树构造运算符(^和!).
我有一个flex字节数组的语法(一个UINT16,用于描述数组中的字节数,后跟那么多字节).我已经注释掉所有语义谓词及其相关代码,这些代码确实证明了数组中的字节数与前两个字节所指示的一样多......那部分不是我遇到的问题.
我的问题是解析一些输入后生成的树.所有发生的事情是每个角色都是兄弟节点.我期望生成的AST与您在ANTLRWorks 1.4的Interpreter窗口中可以看到的树类似.一旦我尝试使用^字符更改树的制作方式,我就会得到一个例外:
Unhandled Exception: System.SystemException: more than one node as root (TODO: make exception hierarchy)
Run Code Online (Sandbox Code Playgroud)
这是语法(目前针对C#):
grammar FlexByteArray_HexGrammar;
options
{
//language = 'Java';
language = 'CSharp2';
output=AST;
}
expr
: array_length remaining_data
//the amount of remaining data must be equal to the array_length (times 2 since 2 hex characters per byte)
// need to check if the array length is zero first to avoid checking $remaining_data.text (null reference) in that situation.
//{ ($array_length.value == 0 && $remaining_data.text == …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个非常简单的语法来学习使用ANTLR,但我收到以下消息:
"永远无法达到以下选择:2"
这是我的语法尝试:
grammar Robot;
file : command+;
command : ( delay|type|move|click|rclick) ;
delay : 'wait' number ';';
type : 'type' id ';';
move : 'move' number ',' number ';';
click : 'click' ;
rclick : 'rlick' ;
id : ('a'..'z'|'A'..'Z')+ ;
number : ('0'..'9')+ ;
WS : (' ' | '\t' | '\r' | '\n' ) { skip();} ;
Run Code Online (Sandbox Code Playgroud)
我正在使用IDEA的ANTLRWorks插件:

在ANTLR中解决此问题的正确方法是什么:
我有一个简单的语法规则,比如一个包含任意数量元素的列表.
list
: '[]'
| '[' value (COMMA value)* ']'
Run Code Online (Sandbox Code Playgroud)
如果我想为list分配一个返回值,并且该值是生产中返回值的实际列表,那么正确的方法是什么?我很有趣的选择是:
我想问题是:酷孩子们如何做到这一点?
(仅供参考我使用的是用于ANTLR的python API,但是如果你用另一种语言打我,我可以处理它)