用于分析ANTLR4中的数据类型和变量描述的识别器语法错误
我需要为这种类型的逻辑实现一个解析器: S字符是语法的初始字符;五十、 T、R、V、K、D、F和E表示非终端字符。终端字符c对应于任务中指定的两种标量类型之一。终端字符t对应于类型部分中可以描述的数据类型之一。 我创建了以下语法:用于分析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
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>代码>代替递归。你的评论对我帮助很大,我按照你的建议做了,一切都很顺利!