2010-01-13 36 views
2

我試圖lex JavaScript常規擴展文字。這些以「/」開始並以「/」結尾(有時還有一些其他修飾符)。問題是確定它是否是正則表達式而不是分割運算符的唯一方法是通過讀取「/」字符前面的標記。fslex lexing javascript正則表達式

人們可以閱讀更多關於這個here

事實上,我找不到有關如何獲取上一個令牌的任何文檔。希望這是可能的,有人可以告訴我如何。

謝謝。

回答

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或者你可能會在不一致的狀態(自上次令牌一個靜態變量)。

1

據我所知,沒有辦法得到以前的令牌(但我沒有嘗試過,而且我很久以前就使用了FSLex)。我想你可以保留一個參數指定最後處理的標記,然後用它來決定當你找到「/」字符時該怎麼做。

無論如何,你可以發佈一些你現在有的代碼(例如只是處理這個問題的一部分)嗎?這將是一個更容易回答你的問題,如果我們會看到一些示例代碼(如果我可以嘗試將其粘貼到我的Visual Studio,看看我能想辦法的!)

T.