![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
mannyz |
![]()
Сообщение
#1
|
Студент ![]() Группа: Новичок Сообщений: 18 Регистрация: 13.3.2010 Пользователь №: 1529 Спасибо сказали: 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: , то ничего токового не происходит. Оно и понятно, файл другой ведь указан |
|
|
![]() |
Балалайка |
![]()
Сообщение
#2
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 20.12.2010 Пользователь №: 2284 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Ну language = C; я ставлю.
Дело в том, что с Java я знаком также второй день. И так, вот что я делал: 1) Я установил себе java-машину - sun jvm 2) Установил себе jdk 3) Скачал antlrworks-1.4.2.jar 4) в настройках компиляции antlrworks выбрал javac и указал путь до папки jdk1.6.0_18 (есть ещё папка jre6, но там нет файла javac) У меня был тестовый проект antl, где всё работает (в antlrworks): лексер, парсер и вызов сем. подпрограмм написанных на java. Так что вроде бы всё работает. После этого я создал лексер, парсер, и выбрал язык java. Жму debug (в antlrworks всё это) и всё нормально, дерево разбора создаётся, подключённый java файл генерирует файл (просто для теста). Далее изменяю язык на Си: options { language = C;}, удаляю папку output и жму ещё раз degug и вылазеет ошибка и в консоле текст: [19:54:53] warning(200): Pascal.g:71:4: Decision can match input such as "'else'" using multiple alternatives: 1, 2 Цитата As a result, alternative(s) 2 were disabled for that input [19:54:53] warning(200): D:\TR2_lab#7\Pascal.g:71:4: Decision can match input such as "'else'" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input [19:54:54] javac: file not found: D:\TR2_lab#7\output\PascalParser.java [19:54:54] Usage: javac <options> <source files> [19:54:54] use -help for a list of possible options При этом в папке output создаётся парсер, лексер - всё на языке си. Понять не могу, зачем требует antlrworks файл PascalParser.java? Также не могу понять, зачем в меню Run пункт Edit *.g Test Rig for C И кстати при компиляции на java создаётся файл __Test__.java, а при указании языка Си , аналогичный файл (__Test__.с) не создаётся |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 4.7.2025, 1:30 |