用于分析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运算符,而不要使用递归。