パラメータをレクサーに渡すことができることを知っています:
rule tokenize scope = parse
| whitespace { tokenize scope lexbuf }
| newline { newline lexbuf; tokenize scope lexbuf }
しかし、同様の方法でパーサー開始シンボルを定義することはできません。
私はそれを次のように定義しようとしました:(この質問のおかげで)
%type < (IScope, AST.Script) Fun > Script
// with the following definition in the head section of the parser:
type ('a,'b) Fun = 'a -> 'b
しかし、このようにすべての非終端記号を定義する必要があり、それらはすべてラムダを返します。scope
これは私が達成しようとしているものではありませんが、いくつかの非端末内でパラメーターにアクセスし、解析中にそれらのアクションを実行できるようにしたいと考えています。
のみを含むIParseStateタイプに があることに気付きましたParserLocalStore
(デバッグによってのみチェックされます)。私はすべての非ターミナルからアクセスできるので、そこにパラメータを保存できますか、それとも悪い考えでしょうか?LexBuffer
parseState
パーサーの head セクションで変更可能な変数を使用することを考えましたが、それらは静的であり (私が思うに?)、複数の入力を同時に解析することはできません...
編集:
scope
現在、特定のトークンにパラメーターを保存します。
%token <string * IScope> IDENT
レキサーは、トークンをscope
作成するときに関連するトークンにそれを埋め込みます... 私はこの解決策が本当に好きではありませんが、まだより良いものを思いつくことができませんでした.