微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于分析ANTLR4

如何解决用于分析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是解析器规则,而不是词法分析器规则,那么它将起作用。

对于分隔符与LR中的L / R之间的空格也是如此。

PS:我强烈建议给您的规则起一个更长的名字,因为很难遵循您的语法。您可能还考虑在+L中使用R运算符,而不要使用递归。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。