标签: antlrworks

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

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

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

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

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

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

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

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

action antlr return-value antlrworks

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

ANTLR"意外结束子树"

嘿.我是ANTLR的新手.ANTLRWorks向导为我烦恼了以下代码:

grammar test;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

FLOAT
    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
    |   '.' ('0'..'9')+ EXPONENT?
    |   ('0'..'9')+ EXPONENT
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;
CHAR:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
    ;

fragment
EXPONENT : …
Run Code Online (Sandbox Code Playgroud)

antlr antlrworks

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

什么^和!代表ANTLR语法

我很难搞清楚^和!代表ANTLR语法术语.

grammar antlr antlrworks antlr3

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

是否可以使用"关键字"也可以视为"非关键字"的语法?

我在ANTLRWorks 1.4中有以下语法.我正在玩文本冒险游戏创建者中实现解析器的想法,用户将为其游戏指定各种允许的命令.

grammar test;

parse       :   cmd EOF;


cmd         :   putSyn1 gameObject inSyn1 gameObject;

putSyn1     :   Put | Place | Drop ;

inSyn1      :   In | Into | Within;


gameObject  :   det obj;

det         :   The | A | An | ;

obj          :  Word obj | Word;


Space       :       (' ' | '\t' | '\r' | '\n'){$channel=HIDDEN;};
Put         :   'put';
Place       :   'place';
Drop        :   'drop';
In          :   'in';
Into        :   'into';
Within      :   'within';
The         :   'the';
A …
Run Code Online (Sandbox Code Playgroud)

grammar parsing antlr antlrworks

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

用不完整的语法进行解析

有没有任何常见的解决方案如何使用不完整的语法?在我的情况下,我只想检测Delphi(Pascal)文件中的方法,这意味着proceduresfunctions.以下第一次尝试正在进行中

    methods
      : ( procedure | function | . )+
      ;
Run Code Online (Sandbox Code Playgroud)

但这是一个解决方案吗?还有更好的解决方案吗?是否可以通过动作停止解析(例如,在检测之后implementation).使用预处理器是否有意义?什么时候 - 如何?

grammar parsing antlr antlrworks parser-generator

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

在ANTLRWorks 2中解释/测试字符串

ANTLRWorks 1.5有一个"解释器"选项卡,您可以在其中输入字符串来测试解析器.到目前为止,我还没有在ANTLRWorks 2中找到任何相同的东西.它是否有类似的东西,如果是这样,它是如何被访问的?

migration string interpreter antlrworks antlrworks2

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

使用ANTLR3将换行符,EOF解析为语句结尾标记

我的问题是关于在ANTLRWorks中运行以下语法:

INT :('0'..'9')+;
SEMICOLON: ';';
NEWLINE: ('\r\n'|'\n'|'\r');
STMTEND: (SEMICOLON (NEWLINE)*|NEWLINE+);

statement
    : STMTEND
    | INT STMTEND
    ;

program: statement+;
Run Code Online (Sandbox Code Playgroud)

无论选择哪个换行NL(CR / LF / CRLF)或整数,我都可以通过以下输入(以程序作为开始规则)获得以下结果:

“; NL ”或“ 32; NL ”解析没有错误。“;” 或“ 45;” (不包含换行符)将导致EarlyExitException。“ NL ”本身解析没有错误。不带分号的“ 456 NL ”会导致MismatchedTokenException。

我想要的是一个语句以换行符,分号或分号后接换行符来终止,并且我希望解析器在终止符上尽可能多地吃掉连续的换行符,因此“; NL NL NL NL ”只是一个终端,而不是四个或五个。另外,我希望文件结尾的情况也可以是有效的终止,但是我还不知道该怎么做。

那么,这有什么问题,如何使它在EOF终止呢?我对解析,ANTLR和EBNF完全陌生,并且在简单的计算器示例和参考之间的某个水平上,我没有发现太多要阅读的资料(我有The Definitive ANTLR Reference,但它确实一个参考,前面有一个快速入门,我还没有在ANTLRWorks之外运行过,所以任何阅读建议(除了Wirth的1977 ACM论文)也将有所帮助。谢谢!

antlr antlrworks antlr3

4
推荐指数
1
解决办法
6228
查看次数

解决 antlr 中的令牌冲突

我有一个令牌 OR:'OR'; 我用于评估布尔表达式(a==b OR a==c)我有另一个规则来解析字符列表AZ,AK,OR,GA中的状态缩写......我发现的是antlr在状态列表上有错误认为 OR 应该是一个or标记而不是

stateName   
    : CHAR CHAR (','|EOF) ->^(STATE CHAR+)
    ;   
Run Code Online (Sandbox Code Playgroud)

我将如何解决这种歧义?

这是我试图解析的一些规则

  • THEN STATE_LICENSE AL,AK,AS,AZ,AR,CT,DE,DC,FM,FL,GA,GU,HI,ID,IL,IN,IA,KS,KY,LA,ME,MH,MD,MA, MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,MP,OH,OK,OR,PW,PA
  • 如果 1198 == "x" 或 1190 != "x" 然后禁用 800
  • IF 801 >= "1000000" THEN DISPLAY_ERROR "It's+too+expensive.+Go+and+get+cheaper+one+!!!"

这是我正在使用的语法

grammar PointFieldRule;


options 
{
//language = 'CSharp3'; 
output=AST; 
ASTLabelType=CommonTree;
} 
tokens{
STATE;

}


rule : ifExpression?  actionExpression EOF!
;
ifExpression 
    :'IF'! logicalConditionExpression
    ;

logicalConditionExpression
    : booleanAndConditionExpression ( BigOR^ booleanAndConditionExpression)*
    ;


booleanAndConditionExpression
    : logicalCondition ( BigAND^ logicalCondition )*
    ;

BigAND …
Run Code Online (Sandbox Code Playgroud)

c# antlr antlrworks antlr3

4
推荐指数
1
解决办法
365
查看次数

编译时ANTLRWorks TestRig卡住了

我最近开始使用ANTLR并发现了ANTLRWorks IDE.虽然编辑器工作正常,但是,当我运行测试装置时,它似乎停留在编译语法文件(或者更确切地说是编译语法没有做什么?),无论我给它什么输入.这是我得到的输出:

ANTLR Codegen

参数:[ - o,C:\ Users \\ AppData\Local\Temp\TestRigTask-1395567588803,-lib,C:\ Users \\ Desktop,-no-listener,-no-visitor,C:\ Users \\ Desktop\Test.g4]

ANTLR Testrig

编译语法文件......

以下是我给它测试问题的输入:

语法

grammar Test;

CUP : 'cup';
MUG : 'mug';
TEA : 'tea';
COFFE: 'coffe';

drinker : 'drinking a' holder 'of' liquid;
holder : MUG | CUP;
liquid : TEA | COFFE;
Run Code Online (Sandbox Code Playgroud)

测试文件

drinking a mug of coffe
Run Code Online (Sandbox Code Playgroud)

我做错了什么/错过了重要的事情吗?

grammar code-generation antlr antlrworks

4
推荐指数
1
解决办法
617
查看次数

antlr3 - 生成解析树

我无法搞清楚antlr3 API,所以我可以在一些javascript代码中生成并使用解析树.当我使用antlrWorks(他们的IDE)打开语法文件时,解释器能够向我显示解析树,它甚至是正确的.

我在使用antlr3运行时跟踪有关如何在我的代码中获取此解析树的资源时遇到很多困难.我一直在搞乱运行时和Parser文件中的各种函数,但无济于事:

var input = "(PR=5000)",
cstream = new org.antlr.runtime.ANTLRStringStream(input),
lexer = new TLexer(cstream),
tstream = new org.antlr.runtime.CommonTokenStream(lexer),
parser = new TParser(tstream);

var tree = parser.query().tree;
var nodeStream = new org.antlr.runtime.tree.CommonTreeNodeStream(tree);
nodeStream.setTokenStream(tstream);

parseTree = new org.antlr.runtime.tree.TreeParser(nodeStream);
Run Code Online (Sandbox Code Playgroud)

由于antlrWorks可以显示解析树而不需要我自己的任何树语法,并且因为我已经读过antlr自动从语法文件生成一个解析树,我假设我可以使用一些运行时函数来访问这个基本的解析树.可能没有意识到.我这个想法是否正确?

antlr antlrworks parse-tree antlr3

3
推荐指数
1
解决办法
6887
查看次数