java - 由于递归规则调用,ANTLR3 错误规则具有非 LL(*) 决策
问题描述
我正在尝试使用 antlr 3 为我的语法生成词法分析器和解析器。有人可以解释这个错误是什么意思吗?
error(211): T.g:14:6: [fatal] rule stmt has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
这是我的语法
grammar T;
prog :
(stmt)+
;
stmt :
assigning
| concatenation
| addorremove
| slicing
;
assigning : ID '=' value
| ID '[' INT ']' '=' value
;
addorremove : ID '.' 'append' '(' value ')'
| ID '.' 'insert' '(' INT ',' value ')'
| ID '.' 'remove' '(' value ')'
;
concatenation :
ID '=' val1=value '+' val2=value
;
slicing : id1=ID '=' id2=ID '[' int1=INT ':' int2=INT ']'
| id1=ID '=' id2=ID '[' int1=INT ':' ']'
| id1=ID '=' id2=ID '[' ':' int2=INT ']'
;
list :
'[' (val1=value (',' val2=value )*)? ']'
| '[' expr 'for' 'x' 'in' id2=ID 'if' op1=operand COMP op2=operand ']'
;
operand :
INT
| 'len' '(' 'x' ')'
| 'abs' '(' 'x' ')'
;
expr :
'x'
| 'len' '(' 'x' ')'
| 'abs' '(' 'x' ')'
| 'max' '(' 'x' ')'
;
value :
INT
| list
| STRING
| ID
;
//lexer rules
STRING : '\'' (~'\'')* '\'';
INT : ('-')? ('0'..'9')+;
ID : ('a'..'z'|'A'..'Z'|'\_') ('a'..'z'|'A'..'Z'|'0'..'9'|'\_')*;
COMP : ('==' | '!=' | '<' | '<=' | '>' | '>=');
// consume whitespace
WS : (' '|'\t'|'\n'|'\r')+ {skip();} ;
// consume comments
COMMENTS : ('//')~('\n'|'\r')* {skip();} ;
该语法旨在重新创建用于列表操作的 Python 简化版本,包括分配、连接、添加和删除元素以及对列表进行切片。
还有一个理解部分来解析形式的列表表达式:[expression for x in list if condition]
解决方案
用 antlr 4 jar 运行语法解决了这个问题。
推荐阅读
- vb.net - 在 VB.Net 应用程序代码中设置 SourceSwitch 未配置
- visual-studio-code - Markdown > 预览:在 VS Code 中打开 Markdown 链接设置有什么作用?
- go - BST删除功能无法追踪问题
- python - 如何使用 NodeJS 在单个 HTTP POST 中发送文件和 JSON 数据(元数据)
- javascript - Javascript警报进入离子登录页面
- javascript - 调用时出现 Javascript 错误
- python - 如何在 Python 中将嵌套列表拆分为多个列表?
- javascript - 以编程方式启动 vue-cli-service serve 时控制 webpack 的详细程度
- flutter - 在 Flutter 中,如何将数据传递给 Stateless Widget?
- php - Spatie Browsershot 无法将网页生成为图像