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()
、それはインタプリタでのみ機能し、生成されたコードでは機能しません。
誰かが私の問題を手伝ってくれますか?