用于分析ANTLR4中的数据类型和变量描述的识别器语法错误

用于分析ANTLR4中的数据类型和变量描述的识别器语法错误,antlr4,Antlr4,我需要为这种类型的逻辑实现一个解析器: S字符是语法的初始字符;五十、 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

我需要为这种类型的逻辑实现一个解析器:

S字符是语法的初始字符;五十、 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;"
)
令牌:
[@0,0:3='type',1:0]
[@1,5:9='byte;',1:5]
[@2,11:13='var',1:11]
[@3,15:22='p1:word;',1:15]
[@4,23:22='',,1:23]
解析树:
编撰(
“类型”
“字节;”
“var”
p1:单词
)

我不明白问题可能是什么,调试是在VS代码中使用来自Antlr的插件执行的。我很乐意回答任何问题

在ANTLR中,lexer规则以大写字母开头,解析器规则以小写字母开头。因此,除了
compileString
之外,您所有的规则都是lexer规则

S:L型VAR-R与输入的
类型字节不匹配;变量p1:单词S
的定义中没有与空格匹配的内容。您可能认为这不重要,因为您跳过了空格,但标记只在lexer规则之间跳过,而不在其中。因此,如果
S
是解析器规则,而不是lexer规则,那么它就可以工作

这同样适用于
L
R
中分隔符和
L
/
R
之间的空格


附言:我强烈建议给你的规则取更长的名字,因为很难遵循你的语法。您也可以考虑使用<代码> +/>代码>运算符>代码> L/COD>和<代码> R>代码>代替递归。你的评论对我帮助很大,我按照你的建议做了,一切都很顺利!