Antlr4语法-允许变量名称带有空格

时间:2019-03-22 10:29:16

标签: grammar antlr4

我是Antlr的新手,我想为自定义编程语言编写一个编译器,该编译器的变量名带有空格。以下是示例代码:

SET Variable with a Long Name TO FALSE
SET Variable with Numbers 1 2 3 in the Name TO 3 JUN 1990
SET Variable with Symbols @ %^& TO "A very long text string"

可变规则: 可以包含空格 可以包含特殊符号

我想用JavaScript编写编译器。以下是我的语法:

grammar Foo;

compilationUnit: stmt*;
stmt:
    assignStmt
    | invocationStmt
;
assignStmt: SET ID TO expr;
invocationStmt: name=ID ((expr COMMA)* expr)?;

expr: ID | INT | STRING;

COMMA: ',';
SAY: 'say';
SET: 'set';
TO: 'to';

INT: [0-9]+;
STRING: '"' (~('\n' | '"'))* '"';
ID: [a-zA-Z_] [ a-zA-Z0-9_]*;
WS: [ \n\t\r]+ -> skip;

我尝试提供以下输入源代码:

"set variable one to 1".

但是出现错误“未定义的令牌标识符”。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

ID: [a-zA-Z_] [ a-zA-Z0-9_]*;

将匹配“将变量1设置为1”。像大多数词法分析器一样,ANTLR的扫描器会尽可能贪婪地进行匹配。 set没有匹配,即使它具有特定的模式。 (即使您设法做到这一点,下一个标记也会匹配“一对一变量”;匹配不会因为出现to而停止。)

处理多单词变量名的最佳方法是将它们视为多个单词。即,将每个单词识别为单独的标记,并将标识符识别为单词序列。结果是two wordstwo words最终成为相同的标识符,但是恕我直言,这是一个功能,而不是错误。