1

私はANTLR文法を書き、それからASTを構築しているところです。当面の問題は、コンテキストに応じて、ルールから異なるサブツリーを生成する必要があることです。グーゲリングは私にこれを与えました:

http://www.antlr.org/wiki/display/~admin/2008/04/11/Rewrite+rules#Rewriterules-Grammaticalcontext

しかし、これらの例から構文を正しく理解することはできません。したがって、問題は次のとおりです。ANTRL3.4でコンテキスト依存の書き換えを使用するための正しい構文は何ですか(この情報が役立つ場合は、Cターゲットを使用)。

最小限の例がここにあり、それを機能させるための私の非機能的な試行の1つがあります。

grammar foo;

tokens {
    A;
    B;
}

start
    :   a
    |   b
    ;

a
    :   foo
    ;

b   :   foo
    ;

foo
    :
    [... a foo]: 'x' -> ^(A 'x')
    [... b foo]: 'x' -> ^(B 'x')
    ;

ありがとう、ジョスト

4

1 に答える 1

2

It's not too clear from that wiki-entry, but most of that syntax is not valid: they're ideas of which some made it in to ANTLR, but some of them didn't (the ... didn't).

To determine from which rule foo was called, you could add a parameter to foo and check that parameter in your rewrite rules:

grammar T;

options {
  // tested with Java, not C, but C should also work "as is"
  //language=C; 
  output=AST;
}

tokens {
  A;
  B;
}

parse
 : (a | b)+ EOF!
 ;

a
 : 'a' foo[1] -> foo
 ;

b
 : 'b' foo[2] -> foo
 ;

foo[int param]
 : 'x' -> {param==1}? ^(A 'x')
       ->             ^(B 'x')
 ;

SPACE : ' ' {$channel=HIDDEN;};

Parsing the input "a x b x" would result in the following AST:

enter image description here

于 2012-08-23T17:41:57.640 に答える