crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Ошибка при использовании ANTLR, Java
smartchecker
  опции профиля:
сообщение 8.12.2012, 14:11
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Где ошибка?
package com.guap.syssoft.lab02;

import org.antlr.runtime.*;

import org.eclipse.swt.widgets.Text;

public class Test1 {
    public static void main(String[] args) {
        try {
            CharStream input = new ANTLRStringStream("asdasd xor ( 0adh");
            MyLang lexer = new MyLang(input);
            Token token;
            
            while ((token = lexer.nextToken()) != Token.EOF_TOKEN) {
              System.out.println("Token: " + token.getText());
            }
         } catch(Throwable t) {
            System.out.println("Exception: " + t);
            t.printStackTrace();
         }        
    }
}

Код выводит лексеммы, а потом продолжает фигачить

Token: <EOF>
Token: <EOF>
Token: <EOF>

Главный вопрос - почему не останавливается?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 8.12.2012, 22:08
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


По моему было бы правильней и наглядней писать так:
do {
            token = lexer.nextToken()
            System.out.println("Token: " + token.getText());
}while( token  != Token.EOF_TOKEN );
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 9.12.2012, 10:42
Сообщение #3


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

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

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




Репутация:   12  


я не пишу на жабе вообще, но, судя по примерам на сайте ANTLR, нужно делать как-то так:
String input = "бла-бла-бла";
CharStream cs = new ANTLRStringStream(input);
JavaParserLexer lexer = new JavaParserLexer(cs);
CommonTokenStream tokens = new CommonTokenStream();
tokens.setTokenSource(lexer);

а дальше у CommonTokenStream есть метод LT:
Цитата
Token org.antlr.runtime.CommonTokenStream.LT ( int k )

Get Token at current input pointer + i ahead where i=1 is next Token. i<0 indicates tokens in the past. So -1 is previous token and -2 is two tokens ago. LT(0) is undefined. For i>=n, return Token.EOFToken. Return null for LT(0) and any index that results in an absolute address that is negative.


Сообщение отредактировал Iron Bug - 9.12.2012, 10:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
smartchecker
  опции профиля:
сообщение 9.12.2012, 13:56
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 83
Регистрация: 7.9.2011
Пользователь №: 2853

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




Репутация:   0  


Спасибо, разобрался.
Надо так:
             String input = "asdasd xor XoR ( 0adh";
             CharStream charStream = new ANTLRStringStream(input);
             MyLang lexer = new MyLang(charStream);

            Token token;
            
            do {
                token = lexer.nextToken();
                System.out.println("Token: " + token.getText() + " type: " + token.getType());
            } while (token.getType() != Token.EOF);

Теперь какбы откопать название токенов, как они названы в файле грамматики?
В коде они генерятся так
public class MyLang extends Lexer {
    public static final int EOF=-1;
    public static final int AND=4;
    public static final int ASSIGN=5;
    public static final int COMMA=6;
    public static final int COMMENT=7;
    public static final int DIGIT=8;
    public static final int HEXDIGIT=9;
    public static final int HEXNUM=10;
    public static final int ID=11;
    public static final int LETTER=12;
    public static final int LPAREN=13;
    public static final int NOT=14;
    public static final int OR=15;
    public static final int RPAREN=16;
    public static final int RULE=17;
    public static final int SEMI=18;
    public static final int WS=19;
    public static final int XOR=20;

Вот мне бы имена переменных, т.е. token.getType() возвращает число, а мне бы имя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 9.12.2012, 18:08
Сообщение #5


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

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

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




Репутация:   12  


Цитата(smartchecker @ 9.12.2012, 16:56) *
token.getType() возвращает число, а мне бы имя.

пиши обработку своих лексем:
http://stackoverflow.com/questions/2228810...ream-with-antlr

P.S. это всё банально находится в гугле за пару минут.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 11:23