我有以下语法,我想匹配字符串“{name1,name2}”。我只想要至少包含一个元素的名字/整数列表。但是我得到了错误:
第1:6行在字符''中没有可行的选择
第1:11行没有可行的选择'}'
第1:7行不匹配的输入'name'需要SIMPLE_VAR_TYPE
我希望空格等被忽略...同样有趣的是输入“{name1,name2}”(在','之后没有空格)时不会出现错误。 继承我的gramar
grammar NusmvInput;
options {
language = Java;
}
@header {
package secltlmc.grammar;
}
@lexer::header {
package secltlmc.grammar;
}
specification :
SIMPLE_VAR_TYPE EOF
;
INTEGER
: ('0'..'9')+
;
SIMPLE_VAR_TYPE
: ('{' (NAME | INTEGER) (',' (NAME | INTEGER))* '}' )
;
NAME
: ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*
;
WS
: (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;}
;
这是我的测试代码
package secltlmc;
public class Main {
public static void main(String[] args) throws
IOException, RecognitionException {
CharStream stream = new ANTLRStringStream("{name1, name2}");
NusmvInputLexer lexer = new NusmvInputLexer(stream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
NusmvInputParser parser = new NusmvInputParser(tokenStream);
parser.specification();
}
}
感谢您的帮助。
答案 0 :(得分:2)
问题在于您尝试使用词法分析器解析SIMPLE_VAR_TYPE
,即您试图将其作为单个令牌。实际上,您似乎想要一个多令牌制作,因为您希望通过WS
将空格重定向到隐藏频道。
您应该将SIMPLE_VAR_TYPE
从词法分析器规则更改为解析器规则,方法是将其首字母(或者更好的是整个名称)更改为小写。
specification :
simple_var_type EOF
;
simple_var_type
: ('{' (NAME | INTEGER) (',' (NAME | INTEGER))* '}' )
;
答案 1 :(得分:1)
SIMPLE_VAR_TYPE
的定义指定了以下表达式:
{
NAME
或INTEGER
,
)后跟NAME
或INTEGER
}
输入中不允许有空格(NAME
和INTEGER
都不允许),所以当你提供一个
尝试:
SIMPLE_VAR_TYPE
: ('{' (NAME | INTEGER) (WS* ',' WS* (NAME | INTEGER))* '}' )
;