我是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".
但是出现错误“未定义的令牌标识符”。
非常感谢您的帮助。
答案 0 :(得分:1)
ID: [a-zA-Z_] [ a-zA-Z0-9_]*;
将匹配“将变量1设置为1”。像大多数词法分析器一样,ANTLR的扫描器会尽可能贪婪地进行匹配。 set
没有匹配,即使它具有特定的模式。 (即使您设法做到这一点,下一个标记也会匹配“一对一变量”;匹配不会因为出现to
而停止。)
处理多单词变量名的最佳方法是将它们视为多个单词。即,将每个单词识别为单独的标记,并将标识符识别为单词序列。结果是two words
和two words
最终成为相同的标识符,但是恕我直言,这是一个功能,而不是错误。