私は最近、架空の言語の ANTLR3 文法を作成する任務を負っています。他のすべては問題ないようですが、いくつかの小さな問題があり、いくつかの助けを借りて行うことができます:
1) コメントは と の間'/*'
にあり'*/'
、入れ子にすることはできません。コメント自体を実装する方法は知っていますが ( '/*' .* '*/'
)、コメントのネストを禁止するにはどうすればよいですか?
2) 文字列リテラルは、二重引用符のペアの間の任意の文字列 (二重引用符と改行を除く) として定義されます。これらは、出力ステートメントでのみ使用できます。私はこれを次のように定義しようとしました:
output : OUTPUT (STRINGLIT | IDENT) ;
STRINGLIT : '"' ~('\r' | '\n' | '"')* '"' ;
ただし、何らかの理由で、パーサーは受け入れます
OUTPUT "Hello,
World!"
としてトークン化し"Hello, \nWorld
ます。感嘆符や締めくくりがどこに"
行ったのか、私にはわかりません。たぶん空白と関係がありますか?
WHITESPACE : ( '\t' | ' ' | '\n' | '\r' | '\f' )+ { $channel = HIDDEN; } ;
アドバイスをいただければ幸いです。お時間をいただきありがとうございます。:)