1

ANTLRが何らかの理由でトークンを無視する理由はありますか?これが相対コードです。var_assignを直接呼び出しています。

LABEL
    :   LETTER (LETTER | DIGIT | '_')*;
fragment LOWER_CASE
    :   'a'..'z';
fragment UPPER_CASE
    :   'A'..'Z';
fragment LETTER
    :   UPPER_CASE | LOWER_CASE;

public var_assign 
    :   LABEL ':=' expression -> ^( VARIABLE_ASSIGNMENT LABEL expression )
    ;

式は、NUMBERやLABEL(変数の場合)などのトークンで終わる式の標準チェーンです。

ここでの問題は、「何でも」と入力するだけで、パーサーがそれを割り当てとして認識することです。

ANTLRStringStream Input = new ANTLRStringStream(input_to_process);
processor.lexer.ConsoleGrammarLexer Lexer = new processor.lexer.ConsoleGrammarLexer(Input);
CommonTokenStream Tokens = new CommonTokenStream(Lexer);
processor.parser.ConsoleGrammarParser Parser = new processor.parser.ConsoleGrammarParser(Tokens);

CommonTree start_rule_tree = Parser.var_assign().Tree;
//view the tree to help debug
processor_output = start_rule_tree.ToStringTree();

「x5」と入力すると、(VARIABLE_ASSIGNMENT x 5))が得られます。「x:= 5」と入力すると、(BLOCK(VARIABLE_ASSIGNMENT x 5))が得られます。「x * 5」と入力すると、(BLOCK、1:1]、resync = x * 5>)が得られます。

これは、constnat"string"をANTLRStringStreamに直接送信した場合でも発生します。

':='を(':=' |'anythinghere')または(':=')*に置き換えることで、これを解決することができました。しかし、他にも奇妙な振る舞いがあります。

言語オプションとしてCSharp3を使用しており、最新の.dllを使用しています。

何が起こっているのか、これはまったく意味がありません。

編集:

テスト文法を作成しました。

grammar testgrammar;

options {
  language = CSharp3;
  output = AST;
  TokenLabelType = CommonToken;
  ASTLabelType = CommonTree;
}

LABEL   :   'a'..'z';

WS  :   ' ' {Skip();};

public start
    :   if_statement EOF!;

if_statement
    :   LABEL ':=' LABEL ->^(LABEL LABEL);

「ff」と入力すると(ff)が生成され、f * fと入力すると実行時エラーが生成され、f:= fと入力すると(ff)が生成されます。何。。地獄。

4

1 に答える 1

1

Java バージョンでは次のようになります。

/tmp $ java TestT
ff
line 1:2 no viable alternative at character '\n'
line 1:1 missing ':=' at 'f'

から:

    InputStream is = System.in;
    if ( inputFile!=null ) {
        is = new FileInputStream(inputFile);
    }
    CharStream input = new ANTLRInputStream(is);

    TLexer lex = new TLexer(input);

    CommonTokenStream tokens = new CommonTokenStream(lex);
    TParser parser = new TParser(tokens);

    parser.start();

どうしたのかわからない。CSharp3 も動作するはずです。私は困惑しています。デバッガーを起動し、ブレークポイントを設定します。それがあなたの唯一の希望です、ルーク!

于 2012-07-22T16:06:49.880 に答える