私はJFlexの字句仕様を書いています(flexに似ていますが、Java用です)。TraditionalComment(/* */
)とDocumentationComment(/** */
)に問題があります。これまでのところ、これはJFlexユーザーズマニュアルから抜粋したものです。
LineTerminator = \r|\n|\r\n
InputCharacter = [^\r\n]
WhiteSpace = {LineTerminator} | [ \t\f]
/* comments */
Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}
TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/"
EndOfLineComment = "//" {InputCharacter}* {LineTerminator}
DocumentationComment = "/**" {CommentContent} "*"+ "/"
CommentContent = ( [^*] | \*+ [^/*] )*
{Comment} { /* Ignore comments */ }
{LineTerminator} { return LexerToken.PASS; }
LexerToken.PASS
後で出力にラインターミネータを渡すことを意味します。今、私がやりたいことは次のとおりです。
改行ターミネータを除いて、コメント内にあるものはすべて無視してください。
たとえば、次のような入力について考えてみます。
/* Some
* quite long comment. */
実はです/* Some\n * quite long comment. */\n
。現在のレクサーでは、1行に変換されます。出力は単一の'\n'になります。しかし、2行にしたいのですが、'\ n\n'です。一般的に、出力には常に入力と同じ行数が必要です。どうやってするの?