1

Я написал эту простую грамматику для ANTLRANTRL простой грамматики и идентификатор

grammar ALang; 

@members { 

public static void main(String[] args) throws Exception { 
    ALangLexer lex = new ALangLexer(new ANTLRFileStream("antlr/ALang.al")); 
    CommonTokenStream tokens = new CommonTokenStream(lex); 
    ALangParser parser = new ALangParser(tokens); 
    parser.prog(); 
} 

} 

prog : 
    ID | PRINT 
    ; 

PRINT : 'print'; 
ID : ('a'..'z' | 'A'..'Z')+; 
WS : (' ' | '\t' | '\n' | '\r')+ { skip(); }; 

Использование в качестве входных данных:

print 

единственный маркер найден является маркером типа ID. Недостаточно ли поставить определение токена PRINT прямо перед определением идентификатора?

+1

разве это не из-за пространства в и из определения термина «PRINT»? – Yola

ответ

1

ALang.g:21:1: The following token definitions can never be matched because prior tokens match the same input: PRINT

Да, этого достаточно. Если определить PRINTпослеID, ANTLR выдаст ошибку:

ALang.g:21:1: The following token definitions can never be matched because prior tokens match the same input: PRINT 

I'm so sorry, i didn't want to use this production: PRINT : 'print '; but the production without the trailing space: PRINT : 'print'; The problem is that 'print' is derived from ID and not from PRINT

Нет, это не может быть.

Следующая:

grammar ALang; 

@members { 
    public static void main(String[] args) throws Exception { 
    ALangLexer lex = new ALangLexer(new ANTLRStringStream("sprint print prints foo")); 
    CommonTokenStream tokens = new CommonTokenStream(lex); 
    ALangParser parser = new ALangParser(tokens); 
    parser.prog(); 
    } 
} 

prog 
: (ID {System.out.printf("ID :: '\%s'\n", $ID.text);} 
    | PRINT {System.out.printf("PRINT :: '\%s'\n", $PRINT.text);} 
    )* 
    EOF 
; 

PRINT : 'print'; 
ID : ('a'..'z' | 'A'..'Z')+; 
WS : (' ' | '\t' | '\n' | '\r')+ {skip();}; 

напечатает:

ID :: 'sprint' 
PRINT :: 'print' 
ID :: 'prints' 
ID :: 'foo' 

Как вы видите, PRINT правило делает матч "print".

+0

Мне очень жаль, я не хотел использовать эту продукцию: PRINT: 'print'; но производство без конечного пространства: PRINT: 'print'; Проблема в том, что 'print' получен из идентификатора, а не из PRINT – Antonio

+0

Большое спасибо Bart. Есть моя обезьяна-действие: скопируйте-вставьте свой g-файл. Создайте парсер. Запустите анализатор. Это мой выход: ID :: 'Спринт' ID :: 'печать' ID :: 'печатает' ID :: 'Foo' версия ANTLR: 3,4. Что вы думаете об этом? – Antonio

+0

еще раз, извините Барт. Он работает сейчас. Возможно, некоторая несогласованность с Eclipse, не знаю. Благодарю. – Antonio

Смежные вопросы