标签: antlrworks

"解析器规则中的隐式令牌定义"需要担心吗?

我正在用ANTLR和ANTLRWorks 2创建我的第一个语法.我主要完成了语法本身(它识别用所描述的语言编写的代码并构建正确的解析树),但我还没有开始做任何事情.

令我担心的是,解析器规则中每个第一次出现的令牌都带有下划线,并带有"解析器规则中的隐式令牌定义".

例如,在此规则中,'var'具有波形:

variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
Run Code Online (Sandbox Code Playgroud)

它看起来如何:

在此输入图像描述

奇怪的是,ANTLR本身似乎并不介意这些规则(在进行测试装备测试时,我在解析器生成器输出中看不到任何这些警告,只是在我的机器上安装了不正确的Java版本),所以这只是ANTLRWorks的抱怨.

是担心还是应该忽略这些警告?我应该在词法分析器规则中明确声明所有令牌吗?官方圣经"定义ANTLR参考"中的大多数exaples 似乎完全按照我编写代码的方式完成.

grammar antlr antlrworks antlr4

27
推荐指数
1
解决办法
1万
查看次数

ANTLR 4何时需要EOF?

ANTLRWorks2中的TestDriver似乎有点挑剔,它什么时候会接受没有和明确的语法EOF,什么时候不接受.ANTLR4入门指南中的Hello语法不会在任何地方使用,因此我推断如果可能的话,最好避免显式.EOFEOF

使用的最佳做法是EOF什么?你什么时候需要它?

antlr antlrworks

16
推荐指数
1
解决办法
1万
查看次数

ANTLR不会在无效输入上抛出错误

我正在使用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抛出异常而不是处理它并恢复.该部分还有一些关于覆盖不匹配和恢复功能的内容,以确保抛出所有可能的异常.

java antlr exception antlrworks

14
推荐指数
1
解决办法
7225
查看次数

可视化使用ANTLR创建的AST(在.Net环境中)

对于一个宠物项目,我开始摆弄ANTLR.在完成一些教程后,我现在正在尝试为我自己的语言创建语法并生成AST.

现在我主要在ANTLRWorks中乱搞,但现在我已经验证了解析树看起来很好我想(迭代地,因为我还在学习并且仍然需要对最终结构做出一些决定)树)创建AST.似乎antlrworks不会将其可视化(或者至少不使用"Interpreter"功能,Debug不能在我的任何机器上运行).

底线:是以手动方式可视化AST的唯一方法,遍历/显示它还是以字符串表示形式将树打印到控制台?

我正在寻找的是从输入,语法 - >视觉AST表示到ANTLRWorks的"解释器"功能的简单方法.有任何想法吗?

c# antlr antlrworks

10
推荐指数
1
解决办法
4880
查看次数

ANTLR和Eclipse(或任何体面的IDE)

我使用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中删除).

eclipse antlr antlrworks antlr4

8
推荐指数
1
解决办法
5242
查看次数

"FOLLOW_set_in _"...在生成的解析器中未定义

我为类似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)

c grammar antlr antlrworks antlr3

7
推荐指数
1
解决办法
312
查看次数

有没有人知道在ANTLRWorks中调试树语法的方法

ANTLR用法的推荐模式是让Parser构造一个抽象语法树,然后构建Tree walker(AKA树语法)来处理它们.

我试图深入了解为什么我的树语法不起作用,并且喜欢使用ANTLRWorks的调试器,就像我将它用于解析器本身一样.解析器的输入是"源代码",但树解析器的输入是解析器的AST结果.我不知道如何使其可用作测试树语法的输入.

目前尚不清楚是否有办法在ANTLRWorks中测试树语法.如果可以做到,那么正确的方向指针将非常受欢迎.

antlr antlrworks

6
推荐指数
1
解决办法
4409
查看次数

ANTLR - 无法获得AST层次结构设置

我试图让我的头围绕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 abstract-syntax-tree antlrworks

6
推荐指数
1
解决办法
2352
查看次数

永远无法达到以下替代方案:2

我正在尝试创建一个非常简单的语法来学习使用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插件:

这就是它的样子

java grammar antlr antlrworks

6
推荐指数
1
解决办法
222
查看次数

如何处理ANTLR中的列表返回值

在ANTLR中解决此问题的正确方法是什么:

我有一个简单的语法规则,比如一个包含任意数量元素的列表.

list
: '[]' 
| '[' value (COMMA value)* ']'
Run Code Online (Sandbox Code Playgroud)

如果我想为list分配一个返回值,并且该值是生产中返回值的实际列表,那么正确的方法是什么?我很有趣的选择是:

  • 在全局范围内创建自己的堆栈以跟踪这些列表
  • 尝试检查我下面的树节点并以这种方式提取信息
  • 以我希望了解的一些光滑和酷炫的方式访问它,我可以从与规则相关的操作中轻松访问这样的列表.

我想问题是:酷孩子们如何做到这一点?

(仅供参考我使用的是用于ANTLR的python API,但是如果你用另一种语言打我,我可以处理它)

action antlr return-value antlrworks

5
推荐指数
1
解决办法
4525
查看次数