2

JavaScript の正規表現リテラルを lex しようとしています。これらは "/" で始まり "/" で終わります (場合によっては他の修飾子も)。問題は、それが除算演算子ではなく正規表現であるかどうかを判断する唯一の方法は、「/」文字の前のトークンを読み取ることです。

これについては、こちらでもう少し詳しく読むことができます。

現状では、以前のトークンを取得する方法に関するドキュメントは見つかりません。うまくいけば、これは可能であり、誰かが私にその方法を教えてくれます.

ありがとう。

4

2 に答える 2

1

私の知る限り、以前のトークンを取得する方法はありません(ただし、それを試したことがなく、かなり前にFSLexを使用していました)。最後に処理されたトークンを指定するパラメーターを保持し、それを使用して「/」文字を見つけたときに何をするかを決定できると思います。

とにかく、あなたはあなたが現在持っているいくつかのサンプルコードを投稿できますか(例えば、この問題を扱う部分だけ)?サンプルコードが表示されれば(そして、それをVisual Studioに貼り付けて、何かを理解できるかどうかを確認できれば)、質問に答えるのははるかに簡単です。

T。

于 2010-01-13T23:00:48.260 に答える
1

この問題を回避するために、最後のトークンを追跡し、有効なトークンのリストを調べて、「/」演算子が除算演算子か正規表現かを確認するモジュールを作成しました。

コードは以下のとおりです。

let mutable lastToken:token = EOF

let setToken token =
    lastToken <- token
    token

let parseDivision (lexbuf:Lexing.lexbuf) (tokenizer:Lexing.LexBuffer<'a> -> JavascriptParser.token) regexer =
    match lastToken.GetType().Name with
    | x when invalidRegexPrefix |> List.contains(x) -> DIVIDE
    | _ -> 
        let result = (regexer lexbuf.StartPos "" lexbuf)
        REGEX(result)

そしてレクサー内で、ルールの結果に対して setToken を呼び出します。例えば:

| '(' { setToken LPAREN }

setToken は、最後のトークンを設定し、設定されたばかりのトークンを返します。これは、実際のレクサー コードへの影響を少なくするためだけのものです。

「/」文字の実際の規則は次のとおりです。

| "/"   { setToken (parseDivision lexbuf token regex) }

また、解析が完了したら、トークンを EOF にリセットする必要があります。そうしないと、一貫性のない状態になる可能性があります (最後のトークンは静的変数であるため)。

于 2010-01-14T00:31:24.780 に答える