我想声明一个字符串,该字符串包含我的语法中的任何字符,但行不通。
这是我的语法:Syrius.g4
当我运行它时,我会收到以下错误:
$ grun Syrius program
string test = "testString";
line 1:6 extraneous input ' ' expecting ID
line 1:11 mismatched input ' ' expecting ';'
语法有什么问题?
说明
您的令牌STR : .;
将与任何字符匹配。STR
是在WS
Lexeme之前定义的,因此它将消耗所有空格字符。解析string test = "testString";
时,Lexer将产生这些令牌的序列:string
,STR
,ID
,...等等。但是解析器正在寻找一个declaration
规则,该规则由string
,ID
,...代币。
解决方案
正确定义STR
令牌。在declaration
解析器规则中使用此令牌:
STR : '"' .*? '"';
// (...)
declaration
: 'int' ID ('=' INTEGER)? ';'
| 'string' ID ('=' STR)? ';'
;