2

次の文法があり、文字列 "{name1, name2}" と一致させたいと考えています。少なくとも 1 つの要素を持つ名前/整数のリストが必要です。ただし、次のエラーが表示されます:
行 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、次の式を指定します。

  • 開ける{
  • NAMEまたはのいずれかが続くINTEGER
  • 以下のゼロ個以上が続く:
    • カンマ ( ,) の後にNAMEまたは のいずれかが続くINTEGER
  • 続いて閉鎖}

入力に空白を許可する場所はどこにもないため(どちらNAMEINTEGER許可しない)、空白を指定するとエラーが発生します

試す:

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