次のアプローチを使用して成功しました。
val keyword = regex ("int[^a-zA-Z]".r)
val identifier = not (keyword) ~> "[a-zA-Z]+".r
つまり、キーワードを拡張して識別子にできる文字が後に続かない場合にのみ、キーワードを認識します。欠点は、拡張正規表現がキーワード定義と識別子定義の両方で繰り返されることですが、必要に応じて除外できます。
キーワード パーサーはキーワードの後の文字もキャプチャするため、キーワード パーサーの使用方法には少し注意する必要があります。not
入力が消費されないため、a のコンテキストでは安全です。
空白は通常、明示的に処理する必要がないことに注意してください。これはliteral
、regex
パーサー コンビネータが本当に必要なものの解析を開始する前に空白を処理するためです。
このアプローチは、キーワード文字列のリストと拡張正規表現からキーワード パーサーを構築するメソッドを作成することで、複数の識別子に簡単に一般化できます。
ところで、Kiama は解析コンビネータを実際には提供していません。Scala ライブラリにあるものに依存しています。特殊な状況向けに標準の拡張機能をいくつか提供していますが、基本的な動作はライブラリから直接取得したものです。したがって、あなたの質問が実際にカイアマに関係しているのかどうかはわかりません。上記のコメントで述べたように、自己完結型の問題の例を含めると、使用しているライブラリを正確に把握するのに役立ちます。