1

antlrに問題があります。私は次の簡単な文法を持っています:

grammar bxk; 
options
{
    language=CSharp3;
}

// start rule
start
    : root* EOF
    ;


root
    : ROOT_ID CT_ID ((rd=rootDefinition) | END)
    ;


rootDefinition  
    : '{'
      ('scope' ASSIGN s=STRING END)?
      ('major' ASSIGN i=STRING END)?
      ('minor' ASSIGN i=STRING END)?
      ('revision' ASSIGN i=STRING END)?
      '}'
    ;   

CHAR    :  ('a'..'z'|'A'..'Z') ;
ROOT_ID :  'ROOT_'(CHAR | DIGIT | SPECIAL)+ ;
CT_ID   :  'ct_'(CHAR | DIGIT | SPECIAL)+ ;
DIGIT   :  '0'..'9';
SPECIAL :  '_' ;
END :  ';';
STRING  :  CHAR (CHAR | DIGIT | SPECIAL)*;
WS      :  (' '|'\t' | '\n' | '\r' | '\u000C')+ {Skip();} ; 

以上です。ここで、c#コードを生成すると、いくつかのエラーが発生します。関数'start'はプライベートであり、常にパブリックに変更する必要があります。さらに、私が公開に変更し、以下を解析する場合:

ROOT_base ct_s { 
 scope=aliejfoac;
}

内部的にはNoViableAltExceptionが発生します。セミコロンの後にスペースを追加すると、正しく実行されます。しかし、私はVisualStudioのDebbugモードでのみ例外を見ることができます。

私が抱えているもう1つの問題は、syntayエラーが表示されないことです。私は追加しました:

catch [RecognitionException re] {
    ReportError(re);
    throw new Exception(re.ToString() + "\non line " + re.Line + " and row " + re.CharPositionInLine.ToString());
}

これで、構文エラーが発生した場合に例外が表示されます。

最後に、私はに問題がありSkip()ます。私がそれを書くとき、Skip()それはインタープリターではなく、生成されたコードで動作します。私が書くときskip()、それはインタプリタでのみ機能し、生成されたコードでは機能しません。

誰かが私の問題を手伝ってくれますか?

4

1 に答える 1

0

user1469116は書いた:

機能「開始」はプライベートであり、常にパブリックに変更する必要があります。

すべてのルールは、C#ターゲットではデフォルトでプライベートです。publicエントリポイントルールの前にキーワードを追加して、明示的に公開します。

public start
 : root* EOF
 ;

user1469116は書いた:

内部的にはNoViableAltExceptionが発生します。セミコロンの後にスペースを追加すると、正しく実行されます。

ルールを追加すると:

ASSIGN :  '=';

入力を正常に解析できます。ANTLRWorksのデバッガーはそれを次のように解析します。

ここに画像の説明を入力してください

user1469116は書いた:

最後に、Skip()に問題があります。Skip()と書くと、インタープリターではなく、生成されたコードで機能します。skip()を書くと、インタープリターでのみ機能し、生成されたコードでは機能しません。

インタプリタ(ANTLRWorksから)は、文法のオプションセクション内のすべてを無視し、Javaベースです。また、Javaターゲットはメソッドskip()を「知っている」だけですが、C#ターゲットはSkip()メソッドを「知っている」だけです。

于 2012-06-20T18:13:11.837 に答える