1

ASTを出力するだけの奇妙なANTLRの問題に直面しています。

       grammar ltxt.g;

options
{
    language=CSharp3;
}


prog    : start
    ;

start       :   '{Start 'loopname'}'statement'{Ende 'loopname'}'
        |   statement
        ;

loopname    :   (('a'..'z')|('A'..'Z')|('1'..'9'))*;
statement   :   '<%' table_ref '>'
        |   start;

table_ref   :   '{'format'}'ID;

format      :   FSTRING 
        |   FSTRING OFSTRING{0,5}
        ;
FSTRING :   '#F'
    |   '#D'
    |   '#U'
    |   '#K'
    ;

OFSTRING:   'F'
    |   'D'
    |   'U'
    |   'K'
    //| 1..65536
    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;


WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

これをcode-genしようとすると、

  • error(100):LTXT.g:1:13:構文エラー:antlr:MismatchedTokenException(74!= 52)。私は74または52を宣言しませんでした。
  • また、「ルール「開始」」が開始状態として見つからないため、Synatx図が表示されません。

私はこれがきれいではないことを知っています、しかし私はそれが少なくともうまくいくと思いました:)

最高、ウィッシー

4

1 に答える 1

2

私が見る4つのエラーがあります。

  • 文法名にピリオドを含めることはできません。それはあなたが得ている構文エラーです。74!=52エラーメッセージは、ANTLRがトークンID52を予期していたときにトークンID74を検出したことを示すヒントです。この場合、これは「他の何かを予期したときに1つのものを検出した」という意味になります。
  • 文法名( "ltxt")と拡張子の前のファイル名( "LTXT")は完全に一致する必要があります。
  • セクションで指定output=AST;しない限り、文法はASTを生成しません。options
  • formatの2番目の選択肢(FSTRING OFSTRING{0,5})は、あなたが考えていることを実行しません。ANTLRは、「0から5秒の一致」などの任意の数の一致をサポートしていませんOFSTRING。発生をカウントするセマンティック述語を使用して、ルールを再定義する必要があります。それらは使いにくいものではありませんが、ANTLRのトリッキーな部分の1つです。

それがあなたが始めるのに役立つことを願っています。

于 2012-12-11T19:10:38.773 に答える