我是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: [ ntr]+ -> skip;
我尝试提供输入源代码为:
"set variable one to 1".
但收到错误"未定义的令牌标识符"。
任何帮助将不胜感激。
ID: [a-zA-Z_] [ a-zA-Z0-9_]*;
将匹配"将变量 1 设置为 1"。像大多数词汇分析仪一样,ANTLR的扫描仪尽可能多地匹配。 即使set
具有特定的模式,也不会匹配。(即使你做到了这一点,"变量 1 到 1"也会在下一个令牌上匹配;匹配不会仅仅因为碰巧出现to
而停止。
处理多单词变量名称的最佳方法是将它们视为多个单词。也就是说,将每个单词识别为单独的标记,并将标识符识别为单词序列。这样做的结果是two words
和two words
最终成为相同的标识符,但恕我直言,这是一个功能,而不是一个错误。