2012-02-03 2 views
0

Эй У меня быстрый вопрос. Я использую ANTLRworks для создания интерпретатора в Java из набора грамматик. Я собирался написать это вручную, но потом понял, что мне не нужно из-за antlrworks. Я получаю эту ошибку, хотяANTLRworks, создающий интерпретатор из грамматики

T.g: 9: 23: этикетки конфликтов ID с маркером с таким же именем

ли ANTLRworks путь идти при создании переводчика с грамматикой. И действительно ли вы видите ошибку в моем коде?

Я пытаюсь сделать ID одной буквы от a-z и не чувствителен к регистру. и иметь пустое пространство между каждой лексемой. СПАСИБО

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> → + | - | * |/
+0

Предполагаю, что это домашнее задание? –

ответ

-1

Некоторые возможные проблемы в вашем коде:

Я думаю, что вы хотите, чтобы ваш ID тегов, чтобы иметь + регулярное выражение так, чтобы он может иметь длину 1 или более, например:

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

Это также выглядит как вам не хватает кавычки вокруг = знака:

assignment_statement: ID '=' arithmetic_expression; 

EDIT

Что касается вашего вопроса левой рекурсии: ANTLR является очень мощным из-за функциональности регулярных выражений. Хотя EBNF (например, тот, который вы представили) может быть ограничен в том, как он может выражать вещи, ANTLR может использоваться для выражения определенных правил грамматики намного проще. Например, если вы хотите иметь оператор statement_list в своем составном_соединении, просто используйте инструкцию с закрытием (*). Вроде так:

compound_statement: 'begin' statement* 'end'; 

Сложно, вы можете удалить ненужные правила, такие как statement_list.

+0

Спасибо, я исправил тех, кто сейчас это всплыл ха-ха. TODO: запуск и отправка вывода на эту консоль [12:26:51] error (211): Tg: 6: 15: [fatal] rule statement_list имеет не-LL (*) решение из-за рекурсивных вызовов правил, доступных из alts 1, 2. Решайте левым факторингом или используйте синтаксические предикаты или используйте параметр backtrack = true. [12:26:51] error (211): X: \ Users \ Zahc \ Documents \ Tg: 6: 15: [fatal] rule statement_list имеет не-LL (*) решение из-за рекурсивных вызовов правил, доступных из alts 1 , 2. Решайте левым факторингом или используйте синтаксические предикаты или используйте параметр backtrack = true. –

+0

Так что, кроме этого, мой код кажется прекрасным? Извините за новые вопросы. Я просто новичок в этом. –

+0

Я не просмотрел ваш код в глубину, я просто пытался предложить некоторые способы его улучшить, а также разоблачить вас в выразительности ANTLR. – jbranchaud

0

Является ли ANTLRworks способ при создании интерпретатора из грамматики.

No.

ANTLRWorks может быть использован только для записи грамматики и, возможно, тест, чтобы увидеть, если он должным образом вход (через отладчик или переводчика). Он не может использоваться для создания интерпретатора для языка, на который вы написали грамматику. ANTLRWorks - всего лишь прикольный текстовый редактор, не более того.

И неужели вы видите ошибку в моем коде?

Как указано Treebranch: у вас не было кавычки = знака в:

assignment_statement: ID = arithmetic_expression; 

делает ANTLR «думать» что вы хотели присвоить метку ID правилу синтаксического анализа arithmetic_expression, который незаконно: вы не можете иметь имя метки, которое также является именем правила (ID, в вашем случае).