私はGRUNで、いくつかの文法をテストしていると私はトークンとして認識され、私のトークンを見ていませんよ。私は当初、このStackOverflow linkに基づいて「暗黙の」トークンを作成したと考えました。ANTLR4 grun rigはトークンを正しく報告していないようです...これはわかりますか?
また、grun -tokensの出力を確認すると、次のリンクが見つかりました: 1)最近のChangeの出力が-tokensです。 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]
を私はトークン名と「は文字」を置き換えます。
私はちょうど何GRUNログレポートを誤って理解していれば今、私は思ったんだけど、-Xlogでantlr4走り、私のトークンは、(第2最後の行に)宣言されています。私は<のデータがレクサーによって渡されたTOKENの名前であると予想しました。私はそれを間違っていますか?
私はトークンをトークンとして認識されるように得るために、私の文法に何ができますか? OR ...レクサーがトークンを正しく識別していることを確認するために、どのように文法をデバッグするのですか?
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}
私は文法を作成しようとしている構文のタイプの例は以下の通りです:
は、ここに私の-Xlogファイルです。
//COMMENTS
;comments
%%DIRECTIVEA
%%DIRECTIVEB
RESERVED_TOKEN(ARGS,ARGS)
%commandA
commandB
commandD
commandE
...
CommandH (only A-H allowed)
// comments
%commandB
%%DIRECTIVEB
%commandD
commandE
%commandA
done
私はまだ実験を行っています。うまくいけば、この質問、および任意の答えは他の人に役立つでしょう。
追加のテストの後で、私が定義した文法/レクサーが機能していることを私は確信できました。私は、TOKEN_NAMEの試験注釈がANTLRの新しい機能であったことに気付きました。 –