crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> ошибка при генерации в ANTLRWorks 1.3.1
mannyz
  опции профиля:
сообщение 13.3.2010, 21:35
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 13.3.2010
Пользователь №: 1529

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый вечер, всем

Пришлось столкнутся с ANTLR и сразу у меня с ним как-то не сложилось.
Пытаюсь для начала сгенерировать простой пример (для Python) с помощью ANTLRWorks. Всего два файла, используемые для генерации.

Eval.g:
Цитата
tree grammar Eval;

options {
language=Python;
tokenVocab=Expr;
ASTLabelType=CommonTree;
}

@init {self.memory = {}}

// START:stat
prog: stat+ ;

stat: expr
{print $expr.value}
| ^('=' ID expr)
{self.memory[$ID.getText()] = int($expr.value)}
;
// END:stat

// START:expr
expr returns [value]
: ^('+' a=expr b=expr) {$value = a+b;}
| ^('-' a=expr b=expr) {$value = a-b;}
| ^('*' a=expr b=expr) {$value = a*b;}
| ID
{
k = $ID.getText()
if k in self.memory:
$value = self.memory[k]
else:
print >> sys.stderr, "undefined variable "+k
}
| INT {$value = int($INT.getText())}
;
// END:expr



и Expr.g:
Цитата
grammar Expr;

options {
language=Python;
output=AST;
ASTLabelType=CommonTree;
}

prog : ( stat {print $stat.tree.toStringTree();} )+ ;

stat : expr NEWLINE -> expr
| ID '=' expr NEWLINE -> ^('=' ID expr)
| NEWLINE ->
;

expr : multExpr (('+'^|'-'^) multExpr)*
;

multExpr
: atom ('*'^ atom)*
;

atom : INT
| ID
| '('! expr ')'!
;

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

INT : '0'..'9'+ ;

NEWLINE : '\r'? '\n' ;

WS : (' '|'\t'|'\n'|'\r')+ {self.skip()} ;



Со вторым файлом Expr.g возникают проблемы. Причем тест на правильность грамматики (Ctrl+R в ANTLRWorks) говорит, что все хорошо. А вот при попытке генерации появляется следующая ошибка:
Цитата
[18:59:55] error(10): internal error: Exception Expr__.g:14:18: unexpected char: '\'@org.antlr.grammar.v2.ANTLRLexer.nextToken(ANTLRLexer.java:347): unexpected stream error from parsing Expr__.g

[18:59:55] error(150): grammar file Expr__.g has no rules
[18:59:55] error(100): Expr__.g:0:0: syntax error: assign.types: <AST>:0:0: unexpected end of subtree
[18:59:55] error(100): Expr__.g:0:0: syntax error: define: <AST>:0:0: unexpected end of subtree
[19:12:10] Checking Grammar Expr.g...
[19:18:09] error(10): internal error: Exception Expr__.g:14:18: unexpected char: '\'@org.antlr.grammar.v2.ANTLRLexer.nextToken(ANTLRLexer.java:347): unexpected stream error from parsing Expr__.g

[19:18:09] error(150): grammar file Expr__.g has no rules
[19:18:09] error(100): Expr__.g:0:0: syntax error: assign.types: <AST>:0:0: unexpected end of subtree
[19:18:09] error(100): Expr__.g:0:0: syntax error: define: <AST>:0:0: unexpected end of subtree



Поясните, пожалуйста, что к чему. Честно сказать, мне даже не понятно, откуда взялось название с двумя подчеркиваниями Expr__.g (как я понимаю, создается временный файл?). И как искать место ошибки? Потому что, если обращаться по адресу 14:18 в файле Expr.g
Цитата
internal error: Exception Expr__.g:14:18: unexpected char:

, то ничего токового не происходит. Оно и понятно, файл другой ведь указан
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 16.3.2010, 22:54
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


насчёт с++: насколько я знаю, модуля под ANTLR для с++ нет. есть только litbantlr3c для си. помнится, я не сразу нашла нужную версию. перекопала несколько разных, пока не собралось всё нормально. ещё какой-то патч нужен был. но с тех пор прошло уже порядком времени, так что, наверное, патч уже внесли в основную ветку.
а что си - ну так фиолетово: ничто не мешает собирать "разношёрстные" проекты. я так и делаю: ANTLR живёт себе в своих сишных файлах, остальное - на плюсах. компилер сам разбирается, нужно только взаимные вызовы из разных сишных деклараций разводить стандартно. всё работает без проблем.

насчёт доков: есть ли на русском документация? честно говоря, хз: мне это ни к чему - у меня два родных языка: Си и английский технический :)

есть книга хорошая, от автора ANTLR:

"The Definitive ANTLR Reference.Building Domain-Specific Languages"
Terence Parr
(The Pragmatic Bookshelf,2007)

но, опять же, на английском. это большая монография по ANTLR, 369 страниц. я её как-то давно ещё с трудом нарыла в сети. очень хорошая книга по ANTLR. полнее не бывает.

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

насчёт AST: это абстрактное синтаксическое дерево. чуть больше, чем просто граф, представляющий распарсенный текст. иногда удобно его использовать. но про это тоже лучше читать докуменацию. так объяснять - сильно многабукаф. это надо вникать в RewriteRules, грубо говоря, это дерево ссылок на данные и функции, которые их обрабатывают(к ним привязываются вызовы пользовательского кода), и оно позволяет вычислять значения выражений "на ходу".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mannyz
  опции профиля:
сообщение 17.3.2010, 0:51
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 18
Регистрация: 13.3.2010
Пользователь №: 1529

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

за советы спасибо. по сайту лазил, но он, действительно, на английском )). книжку "The Definitive ANTLR Reference.Building Domain-Specific Languages" скачал, но не всегда все понятно.
буду разбираться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- mannyz   ошибка при генерации в ANTLRWorks 1.3.1   13.3.2010, 21:35
- - Iron Bug   похоже, это у тебя его от формата файла тошнит. во...   14.3.2010, 17:19
|- - mannyz   Цитата(Iron Bug @ 14.3.2010, 17:19) похож...   14.3.2010, 21:12
- - Iron Bug   у меня под линём ANTLRWorks вполне нормально работ...   15.3.2010, 17:44
|- - mannyz   а как перенаправить cin или stdin во входной поток...   16.3.2010, 17:49
- - Litkevich Yuriy   mannyz, не цитируй большими кусками. О том, как ци...   16.3.2010, 17:52
- - Iron Bug   Цитата(mannyz @ 16.3.2010, 19:49) Но може...   16.3.2010, 18:44
|- - mannyz   Цитата(Iron Bug @ 16.3.2010, 18:44) Цитат...   16.3.2010, 19:04
- - Iron Bug   дык, под Си оно не намного сложнее. просто пишется...   16.3.2010, 20:17
|- - mannyz   ага, спасибо. я так и делал. кстати, а можно поясн...   16.3.2010, 20:49
- - Iron Bug   насчёт с++: насколько я знаю, модуля под ANTLR для...   16.3.2010, 22:54
|- - mannyz   прикольно, ты девушка )). и тебе нравиться прогать...   17.3.2010, 0:51
|- - mannyz   а ты случайно встроенной хэш-таблицей ANTLR-овской...   17.3.2010, 2:27
- - Iron Bug   мдя... я не юзала хэш-таблицы в ANTLR-овской реали...   17.3.2010, 22:19
|- - mannyz   Цитатамдя... я не юзала хэш-таблицы в ANTLR-овской...   17.3.2010, 23:33
|- - mannyz   кстати, в том примере для Си, который я выше приве...   18.3.2010, 13:20
- - Iron Bug   пишут, что разве что так. rule { int c = 0; } ...   18.3.2010, 23:03
|- - mannyz   ясненько. спасибо )   19.3.2010, 8:38
|- - mannyz   IronBug, скажи, пожалуйста, можно ли в варианте дл...   23.3.2010, 13:45
- - Iron Bug   не знаю. не задумывалась над этим. читай доки, смо...   24.3.2010, 13:37
- - Балалайка   граждане, только 2ой день с ANTLR знаком. Не пойму...   20.12.2010, 14:10
- - Iron Bug   точно сейчас не скажу, но примерно так: 1. в коде ...   20.12.2010, 14:39
- - Балалайка   Ну language = C; я ставлю. Дело в том, что с J...   20.12.2010, 17:00


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 17:04