регулярные выражения JavaScript - PullRequest
2 голосов
/ 13 января 2010

Я пытаюсь использовать регулярные выражения в JavaScript. Они начинаются с "/" и заканчиваются "/" (а иногда и некоторыми другими модификаторами). Проблема заключается в том, что единственный способ определить, является ли оно регулярным выражением, а не оператором деления, - это прочитать токены перед символом "/".

Подробнее об этом можно прочитать здесь .

На самом деле я не могу найти никакой документации о том, как получить предыдущий токен. Надеюсь, это возможно, и кто-то может сказать мне, как.

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 января 2010

Чтобы обойти эту проблему, я создал модуль, который отслеживает последний токен и просматривает список допустимых токенов, чтобы определить, является ли оператор "/" оператором деления или регулярным выражением.

Код ниже:

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 для результата правила. Например:

* +1007 *

setToken устанавливает последний токен и возвращает только что установленный токен, только для того, чтобы он был менее навязчивым к реальному коду лексера.

Фактическое правило для символа "/":

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

Также необходимо сбросить токен в EOF, как только анализ будет завершен, или вы можете оказаться в несогласованном состоянии (поскольку последний токен является статической переменной).

1 голос
/ 14 января 2010

Насколько я знаю, нет никакого способа получить предыдущий токен (но я не пробовал это, и я использовал FSLex довольно давно). Я думаю, вы могли бы сохранить параметр, указывающий последний обработанный токен, а затем использовать его, чтобы решить, что делать, когда вы найдете символ "/".

В любом случае, не могли бы вы опубликовать какой-нибудь пример кода, который у вас есть (например, только часть, которая занимается этой проблемой)? Было бы намного проще ответить на ваш вопрос, если бы мы увидели некоторый пример кода (и если бы я мог попробовать вставить его в мою Visual Studio и посмотреть, смогу ли я что-нибудь выяснить!)

Т.

...