2017-03-27 1 views
1

私は開発中の新しい言語に文法を書いています。 言語は、コメントについては、以下のように定義されていますコメントだけで行を無視しながら、インラインコメントをキャプチャするための文法を書くには?

  1. コメントをいずれかになります「インライン」または「のみ行」コメント
  2. 「インライン」コメント#
  3. で始まるが、「唯一ライン」のコメントどちらか#または*
  4. すべての言語の文で始まるがで終わるnewline
  5. 「のみオンライン」のコメントを無視することができ
  6. 「インライン」のコメントが処理されるべき(コードジェネレータ段階でツリーウォーカーに渡された値)

例:ここでは

keyword(0x12, 0x12) # this is an inline comment 
keyword(0x34, 0x34) # this is another inline comment 

# this is an "only-line" comment 
* this is another "only-line" comment 
keyword(0x55, 0x55) # this is the 3rd inline comment 

は、この目標を達成するために私の(減少)文法である:

statement : empty_line 
      | comment_statement 
      | keyword_statement 
      ; 

keyword_statement : 'keyword' '(' HEX_VALUE ',' HEX_VALUE ')' in_line_comment?; 

in_line_comment : IN_LINE_COMMENT; 

comment_statement : LINE_COMMENT; 
empty_line  : NL; 

IN_LINE_COMMENT : '#' ~[\r\n]* ; 
LINE_COMMENT : [#*] ~[\r\n]* -> skip; 

HEX_VALUE  : '0x' [0-9a-fA-F]+; 

NL    : '\r'? '\n' -> channel(2); 
WS    : [ \t]+ -> skip; 

Antlr4をコンパイルし、文法の利回りに例のテキストを送り:

[@0,0:6='keyword',<'keyword'>,1:0] 
[@1,7:7='(',<'('>,1:7] 
[@2,8:11='0x12',<HEX_VALUE>,1:8] 
[@3,12:12=',',<','>,1:12] 
[@4,14:17='0x12',<HEX_VALUE>,1:14] 
[@5,18:18=')',<')'>,1:18] 
[@6,20:46='# this is an inline comment',<IN_LINE_COMMENT>,1:20] 
[@7,47:47='\n',<NL>,channel=2,1:47] 
[@8,48:54='keyword',<'keyword'>,2:0] 
[@9,55:55='(',<'('>,2:7] 
[@10,56:59='0x34',<HEX_VALUE>,2:8] 
[@11,60:60=',',<','>,2:12] 
[@12,62:65='0x34',<HEX_VALUE>,2:14] 
[@13,66:66=')',<')'>,2:18] 
[@14,68:99='# this is another inline comment',<IN_LINE_COMMENT>,2:20] 
[@15,100:100='\n',<NL>,channel=2,2:52] 
[@16,101:101='\n',<NL>,channel=2,3:0] 
[@17,102:133='# this is an "only-line" comment',<IN_LINE_COMMENT>,4:0] 
[@18,134:134='\n',<NL>,channel=2,4:32] 
[@19,172:172='\n',<NL>,channel=2,5:37] 
[@20,173:179='keyword',<'keyword'>,6:0] 
[@21,180:180='(',<'('>,6:7] 
[@22,181:184='0x55',<HEX_VALUE>,6:8] 
[@23,185:185=',',<','>,6:12] 
[@24,187:190='0x55',<HEX_VALUE>,6:14] 
[@25,191:191=')',<')'>,6:18] 
[@26,193:224='# this is the 3rd inline comment',<IN_LINE_COMMENT>,6:20] 
[@27,225:225='\n',<NL>,channel=2,6:52] 
[@28,226:225='<EOF>',<EOF>,7:0] 
line 4:0 extraneous input '# this is an "only-line" comment' expecting {<EOF>, 'keyword', LINE_COMMENT, NL} 

これは、#で始まる「唯一の行」のコメントが間違っているLINE_COMMENTトークンとして識別されることを意味します。

どのように文章でそのコメントを扱うように指示できますか?

答えて

0

これを自分自身とコミュニティサービスとして掘り起こしてください。

ここに私の解決策です。 問題を解決するために文法で意味論的述語を使用しました。解決策は、現在のJava実装を使用している は(ちょうどAntlr4のPythonの複雑さを排除するため) - しかし、私は確信してのpythonに下記変換します

マイ修正文法:

@lexer::members { 
    int in_line = 0;          <-- initialize to "only-line" 
} 

prog  : statement+ EOF; 

statement : empty_line 
      | comment_statement 
      | keyword_statement 
      ; 

keyword_statement : KEYWORD '(' HEX_VALUE ',' HEX_VALUE ')' in_line_comment?; 

in_line_comment : IN_LINE_COMMENT; 

comment_statement : LINE_COMMENT; 
empty_line  : NL; 

KEYWORD   : 'keyword' {in_line = 1;}; 

IN_LINE_COMMENT : '#' ~[\r\n]* {in_line == 1}?;   <-- will match this token only if in_line == 1 in run-time 
LINE_COMMENT : [#*] ~[\r\n]* -> skip; 

HEX_VALUE  : '0x' [0-9a-fA-F]+; 

NL    : '\r'? '\n' {in_line = 0;}-> channel(2); <-- reset in_line to 0 after every statement 
WS    : [ \t]+ -> skip; 
関連する問題