2

我有以下语法,我想匹配字符串“{name1,name2}”。我只想要包含至少一个元素的名称/整数列表。但是我收到错误:
第 1:6 行在字符“”处
没有可行的替代方案 第 1:11 行在字符“}”处没有可行的替代方案
第 1:7 行不匹配的输入“名称”期待 SIMPLE_VAR_TYPE

我希望空格等被忽略......另外有趣的是输入“{name1,name2}”不会发生错误(','之后没有空格)。这是我的语法

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();
    }
}

谢谢你的帮助。

4

2 回答 2

2

问题是您正在尝试SIMPLE_VAR_TYPE使用词法分析器进行解析,即您正在尝试使其成为单个标记。实际上,看起来您想要一个多令牌生产,因为您希望空格通过WS.

您应该将SIMPLE_VAR_TYPE词法分析器规则更改为解析器规则,方法是将其首字母(或者更好的是,整个名称)更改为小写。

specification : 
     simple_var_type EOF
     ;    

simple_var_type 
    : ('{' (NAME | INTEGER) (',' (NAME | INTEGER))* '}'  )
    ;
于 2012-06-12T22:11:27.427 回答
1

的定义SIMPLE_VAR_TYPE指定以下表达式:

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

它在任何地方都不允许输入中的空格(也NAME不允许INTEGER),因此在提供空格时会出现错误

尝试:

SIMPLE_VAR_TYPE 
: ('{' (NAME | INTEGER) (WS* ',' WS* (NAME | INTEGER))* '}'  )
;
于 2012-06-12T22:15:28.377 回答