0

Kiama Packrat パーサーに与える正しい正規表現形式を探していますint。これは、有効な var 名ではなく、型であると認識するようなキーワードに遭遇したときです。

現在、私は持っています:

    lazy val type_int_ =  ".*\\bint\\b.*".r ^^ (s => TypeInt)


lazy val var_ =
    idn ^^ TermVar 


  lazy val idn =
    "[a-zA-Z][a-zA-Z0-9]*".r

しかし、これはうまくいかないので、これについての指針をいただければ幸いです。

どうもありがとう

4

1 に答える 1

1

次のアプローチを使用して成功しました。

val keyword = regex ("int[^a-zA-Z]".r)

val identifier = not (keyword) ~> "[a-zA-Z]+".r

つまり、キーワードを拡張して識別子にできる文字が後に続かない場合にのみ、キーワードを認識します。欠点は、拡張正規表現がキーワード定義と識別子定義の両方で繰り返されることですが、必要に応じて除外できます。

キーワード パーサーはキーワードの後の文字もキャプチャするため、キーワード パーサーの使用方法には少し注意する必要があります。not入力が消費されないため、a のコンテキストでは安全です。

空白は通常、明示的に処理する必要がないことに注意してください。これはliteralregexパーサー コンビネータが本当に必要なものの解析を開始する前に空白を処理するためです。

このアプローチは、キーワード文字列のリストと拡張正規表現からキーワード パーサーを構築するメソッドを作成することで、複数の識別子に簡単に一般化できます。

ところで、Kiama は解析コンビネータを実際には提供していません。Scala ライブラリにあるものに依存しています。特殊な状況向けに標準の拡張機能をいくつか提供していますが、基本的な動作はライブラリから直接取得したものです。したがって、あなたの質問が実際にカイアマに関係しているのかどうかはわかりません。上記のコメントで述べたように、自己完結型の問題の例を含めると、使用しているライブラリを正確に把握するのに役立ちます。

于 2012-08-14T05:33:33.307 に答える