Antlr空白标记错误

时间:2012-06-12 21:59:19

标签: parsing antlr grammar

我有以下语法,我想匹配字符串“{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();
    }
}

感谢您的帮助。

2 个答案:

答案 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的定义指定了以下表达式:

  • 打开{
  • 后跟NAMEINTEGER
  • 之一
  • 以下零个或多个:
    • 逗号(,)后跟NAMEINTEGER
    • 之一
  • 然后关闭}

输入中不允许有空格(NAMEINTEGER都不允许),所以当你提供一个

时会出错

尝试:

SIMPLE_VAR_TYPE 
: ('{' (NAME | INTEGER) (WS* ',' WS* (NAME | INTEGER))* '}'  )
;