ANTLRworks создает интерпретатор из грамматики - PullRequest
0 голосов
/ 03 февраля 2012

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

Tg: 9: 23: идентификатор метки конфликтует с токеном с тем же именем

Способ ANTLR работает при создании интерпретатора из грамматики.И вы видите какие-либо ошибки в моем коде?

Я пытаюсь сделать ID одной буквой от 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> → + | - | * | / 

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

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

номер

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

И видите ли вы какую-либо ошибку в моем коде?

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

assignment_statement:   ID = arithmetic_expression;

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

0 голосов
/ 03 февраля 2012

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

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

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

Выглядит так, как будто вы пропускаете кавычки вокруг знака =:

assignment_statement:   ID '=' arithmetic_expression;

РЕДАКТИРОВАТЬ

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

compound_statement: 'begin' statement* 'end';

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

...