如何解决用于分析ANTLR4
我需要为此类逻辑实现解析器:the specified grammar
S 字符是语法的初始字符; L,T,R,V,K,D,F和E表示非终结符。结束符 c 对应于任务中指定的两种标量类型之一。终端字符 t 对应于可以在类型部分中描述的数据类型之一。 我创建了以下语法:
grammar Parse;
compileString: S+;
S: TYPE L VAR R;
L: T (SEParaTOR|SEParaTOR L);
R: V (SEParaTOR|SEParaTOR R);
V: [a-zA-Z] ([a-zA-Z]| [0-9]|'_')* DEFinitioN (D|C);
T: D|C;
TYPE:'type';
VAR:'var';
D: // acceptable data types
'struct'
| 'union'
| 'array'
;
C: 'byte'
|'word' //scalar type
;
SEParaTOR:';';
DEFinitioN :':';
WS : [ \t\n\r]+ -> skip ; // whitespaces
但是当我尝试执行以下构造:“ type byte; var p1:word;” 时,得到以下输出:
Tokens:
[@0,0:3='type',<6>,1:0]
[@1,5:9='byte;',<2>,1:5]
[@2,11:13='var',<7>,1:11]
[@3,15:22='p1:word;',<3>,1:15]
[@4,23:22='<EOF>',<-1>,1:23]
Parse Tree:
compileString (
<Error>"type"
<Error>"byte;"
<Error>"var"
<Error>"p1:word;"
)
我不明白问题可能是什么,调试是通过VS Code中的Antlr插件进行的。我很乐意回答!
解决方法
在ANTLR中,词法分析器规则以大写字母开头,而解析器规则以小写字母开头。因此,除compileString
以外的所有规则都是词法分析器规则。
S: TYPE L VAR R;
与输入type byte; var p1:word;
不匹配,因为其中有空格,而S
的定义中没有空格匹配。您可能会认为这无关紧要,因为您正在跳过空格,但是令牌仅在词法分析器规则之间而不在其内部被跳过。因此,如果S
是解析器规则,而不是词法分析器规则,那么它将起作用。
对于分隔符与L
和R
中的L
/ R
之间的空格也是如此。
PS:我强烈建议给您的规则起一个更长的名字,因为很难遵循您的语法。您可能还考虑在+
和L
中使用R
运算符,而不要使用递归。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。