在ANTLR中解决此问题的正确方法是什么:
我有一个简单的语法规则,比如一个包含任意数量元素的列表.
list
: '[]'
| '[' value (COMMA value)* ']'
Run Code Online (Sandbox Code Playgroud)
如果我想为list分配一个返回值,并且该值是生产中返回值的实际列表,那么正确的方法是什么?我很有趣的选择是:
我想问题是:酷孩子们如何做到这一点?
(仅供参考我使用的是用于ANTLR的python API,但是如果你用另一种语言打我,我可以处理它)
嘿.我是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) 我在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) 有没有任何常见的解决方案如何使用不完整的语法?在我的情况下,我只想检测Delphi(Pascal)文件中的方法,这意味着procedures和functions.以下第一次尝试正在进行中
methods
: ( procedure | function | . )+
;
Run Code Online (Sandbox Code Playgroud)
但这是一个解决方案吗?还有更好的解决方案吗?是否可以通过动作停止解析(例如,在检测之后implementation).使用预处理器是否有意义?什么时候 - 如何?
ANTLRWorks 1.5有一个"解释器"选项卡,您可以在其中输入字符串来测试解析器.到目前为止,我还没有在ANTLRWorks 2中找到任何相同的东西.它是否有类似的东西,如果是这样,它是如何被访问的?
我的问题是关于在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论文)也将有所帮助。谢谢!
我有一个令牌 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)
我将如何解决这种歧义?
这是我试图解析的一些规则
这是我正在使用的语法
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) 我最近开始使用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)
我做错了什么/错过了重要的事情吗?
我无法搞清楚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自动从语法文件生成一个解析树,我假设我可以使用一些运行时函数来访问这个基本的解析树.可能没有意识到.我这个想法是否正确?
antlrworks ×10
antlr ×9
antlr3 ×4
grammar ×4
parsing ×2
action ×1
antlrworks2 ×1
c# ×1
interpreter ×1
migration ×1
parse-tree ×1
return-value ×1
string ×1