Я тестирую некоторую грамматику с grun, и я не вижу, что мои жетоны распознаются как токены. Сначала я подумал, что, возможно, я создал «неявные» токены на основе этого StackOverflow link.ANTLR4 Утренняя урна, по-видимому, не сообщает маркеры правильно ... я понимаю это?
Кроме того, при просмотре вывода grun-tokens я нашел эти ссылки: 1) Последние Change - totokens output. 2) Возможно устаревшее testrig.md Я расколол это и врылся в него.
Вот мой простой HelloTC.g4 где я исследую это:
grammar HelloTC;
r : HELLO id;
WS : [ \r\t\n]+ -> skip ;
CMD: '%';
DIR: '%%';
A: 'A';
AA: 'AA';
HELLO:'hello';
ID : [a-z]+ ;
id : DIR | CMD | A | AA;
я проверить это с:
grun HelloTC r -tokens
hello %%
hello %
hello A
hello AA
^Z
[@0,0:4='hello',<'hello'>,1:0]
[@1,6:7='%%',<'%%'>,1:6]
[@2,10:14='hello',<'hello'>,2:0]
[@3,16:16='%',<'%'>,2:6]
[@4,19:23='hello',<'hello'>,3:0]
[@5,25:25='A',<'A'>,3:6]
[@6,28:32='hello',<'hello'>,4:0]
[@7,34:35='AA',<'AA'>,4:6]
[@8,38:37='<EOF>',<EOF>,5:0]
Ни один из моих лексем не признаются в качестве маркеров. я ожидал:
[@0,0:4='hello',<HELLO>,1:0]
[@1,6:7='%%',<DIR>,1:6]
[@2,10:14='hello',<HELLO>,2:0]
[@3,16:16='%',<CMD>,2:6]
[@4,19:23='hello',<HELLO>,3:0]
[@5,25:25='A',<A>,3:6]
[@6,28:32='hello',<HELLO>,4:0]
[@7,34:35='AA',<AA>,4:6]
[@8,38:37='<EOF>',<EOF>,5:0]
В моих ожидаемых результатах я заменил «символов» с именем лексемы.
Я запустил antlr4 с -Xlog, и мои токены объявлены (от второй до последней строки), так что теперь мне интересно, просто ли я неправильно понимаю, что сообщает отчет grun. Я ожидал, что данные в <> будут именем TOKEN, переданным лексером. У меня это неправильно?
Что я могу сделать с моей грамматикой, чтобы распознать токены? ИЛИ ... как отлаживать грамматик, чтобы лексер правильно идентифицировал маркеры?
Вот мой -Xlog файл:
2017-01-20 06:57:29:640 grammar LogManager.java:25 before: (COMBINED_GRAMMAR HelloTC (RULES (RULE r (BLOCK (ALT HELLO id))) (RULE WS (BLOCK (LEXER_ALT_ACTION (ALT (+ (BLOCK (ALT [ \r\t\n])))) skip))) (RULE CMD (BLOCK (ALT '%cat'))) (RULE DIR (BLOCK (ALT '%%'))) (RULE A (BLOCK (ALT 'A'))) (RULE AA (BLOCK (ALT 'AA'))) (RULE HELLO (BLOCK (ALT 'hello'))) (RULE id (BLOCK (ALT DIR) (ALT CMD) (ALT A) (ALT AA)))))
2017-01-20 06:57:29:661 grammar LogManager.java:25 after: (COMBINED_GRAMMAR HelloTC (RULES (RULE r (BLOCK (ALT HELLO id))) (RULE WS (BLOCK (LEXER_ALT_ACTION (ALT (+ (BLOCK (ALT [ \r\t\n])))) skip))) (RULE CMD (BLOCK (ALT '%cat'))) (RULE DIR (BLOCK (ALT '%%'))) (RULE A (BLOCK (ALT 'A'))) (RULE AA (BLOCK (ALT 'AA'))) (RULE HELLO (BLOCK (ALT 'hello'))) (RULE id (BLOCK (ALT (SET DIR CMD A AA))))))
2017-01-20 06:57:29:694 grammar LogManager.java:25 after extract implicit lexer =(COMBINED_GRAMMAR HelloTC (RULES (RULE r (BLOCK (ALT HELLO id))) (RULE id (BLOCK (ALT (SET DIR CMD A AA))))))
2017-01-20 06:57:29:694 grammar LogManager.java:25 lexer =(LEXER_GRAMMAR HelloTCLexer (RULES (RULE WS (BLOCK (LEXER_ALT_ACTION (ALT (+ (BLOCK (ALT [ \r\t\n])))) skip))) (RULE CMD (BLOCK (ALT '%cat'))) (RULE DIR (BLOCK (ALT '%%'))) (RULE A (BLOCK (ALT 'A'))) (RULE AA (BLOCK (ALT 'AA'))) (RULE HELLO (BLOCK (ALT 'hello')))))
2017-01-20 06:57:30:040 semantics LogManager.java:25 tokens={EOF=-1, WS=1, CMD=2, DIR=3, A=4, AA=5, HELLO=6}
2017-01-20 06:57:30:040 semantics LogManager.java:25 strings={'%cat'=2, '%%'=3, 'A'=4, 'AA'=5, 'hello'=6}
Пример типа синтаксиса Я пытаюсь создать грамматику для ниже.
//COMMENTS
;comments
%%DIRECTIVEA
%%DIRECTIVEB
RESERVED_TOKEN(ARGS,ARGS)
%commandA
commandB
commandD
commandE
...
CommandH (only A-H allowed)
// comments
%commandB
%%DIRECTIVEB
%commandD
commandE
%commandA
done
Я все еще экспериментировал и экспериментировал. Надеюсь, этот вопрос, и любые ответы помогут другим.
После дополнительного тестирования я смог убедить себя, что грамматика/лексер, который я определил, работает. Я заметил, что аннотация testrig TOKEN_NAME была более новой функцией в ANTLR после копания. –