0

ちょっと質問があります。ANTLRworks を使用して、一連の文法から Java でインタープリターを作成しています。手で書き出すつもりでしたが、antlrworks のおかげでその必要がないことに気付きました。私はこのエラーが発生しています

Tg:9:23: ラベル ID が同じ名前のトークンと競合しています

ANTLR は、文法からインタープリターを作成するときに使用する方法です。そして、私のコードにエラーが表示されますか?

ID を az から 1 文字にし、大文字と小文字を区別しないようにしています。そして、すべての語彙素の間に空白を入れます。ありがとうございました

grammar T;

programs : ID WS compound_statement;

statement:       
if_statement|assignment_statement|while_statement|print_statement|compound_statement;

compound_statement: 'begin' statement_list 'end';

statement_list: statement|statement WS statement_list;  

if_statement:    'if' '(' boolean_expression ')' 'then' statement 'else' statement;

while_statement:    'while' boolean_expression 'do' statement;

assignment_statement:   ID = arithmetic_expression;

print_statement:    'print' ID;

boolean_expression: operand relative_op operand;

operand :   ID |INT;

relative_op:    '<'|'<='|'>'|'>='|'=='|'/=';

arithmetic_expression:  operand|operand WS arithmetic_op WS operand;

arithmetic_op:  '+'|'-'|'*'|'/';


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

INT :   '0'..'9'+
;
WS  :   ( ' '
    | '\t'
    | '\r'
    | '\n'
    ) {$channel=HIDDEN;}
;

そしてここに文法があります

<program> → program id <compound_statement>

<statement> → <if_statement> | <assignment_statement> | <while_statement> |     
<print_statement> | <compound_statement>

<compound_statement> → begin <statement_list> end

<statement_list> → <statement> | <statement> ; <statement_list>

<if_statement> → if <boolean_expression> then <statement> else <statement>

<while_statement> → while <boolean_expression> do <statement>

<assignment_statement> -> id := <arithmetic_expression>

<print_statement> → print id

<boolean_expression> → <operand> <relative_op> <operand>

<operand> → id | constant

<relative_op> → < | <= | > | >= | = | /=

<arithmetic_expression> → <operand> | <operand> <arithmetic_op> <operand>

<arithmetic_op> → + | - | * | / 
4

2 に答える 2

0

ANTLR は、文法からインタープリターを作成するときに使用する方法です。

いいえ。

ANTLRWorks は、文法を記述し、場合によってはそれが適切に入力されているかどうかをテストするためにのみ使用できます (デバッガーまたはインタープリターを介して)。文法を記述した言語のインタープリターを作成するために使用することはできません。ANTLRWorks はただのテキスト エディタであり、それ以上のものではありません。

そして、私のコードにエラーが表示されますか?

Treebranch で示されているよう=に: サインインの周りに引用符がありませんでした:

assignment_statement:   ID = arithmetic_expression;

IDANTLR に、ラベルをパーサー ruleに割り当てたいと「思わせる」ようにしますがarithmetic_expression、これは違法です。ルールの名前でもある label-name を持つことはできません (IDこの場合は )。

于 2012-02-03T23:06:22.917 に答える
-1

コードで考えられる問題:

+次のように、IDタグに正規表現を付けて長さ1以上にする必要があると思います。

ID  :   ('a'..'z'|'A'..'Z'|'_')+
;

また、=サインの周りに引用符がないようです。

assignment_statement:   ID '=' arithmetic_expression;

編集

左再帰の問題について:正規表現機能があるため、ANTLRは非常に強力です。EBNF(あなたが提示したもののような)は物事を表現する方法が制限されているかもしれませんが、ANTLRは特定の文法規則をはるかに簡単な方法で表現するために使用できます。たとえば、compound_statementにstatement_listを含める場合は、ステートメントルールをclosure( )とともに使用します*。そのようです:

compound_statement: 'begin' statement* 'end';

突然、statement_listのような不要なルールを削除できます。

于 2012-02-03T17:23:51.897 に答える