使用解析器

2021-06-22 11:39:09 字數 1815 閱讀 8701

使用解析器

使用解析器是非常簡單,可以使用它自己的詞法分析器,但是,用fsyacc.exe 產生的解析器總是要求詞法分析器。在這一小節,我們將討論如何使用自己的詞法分析器,以及與解析器聯合。

警告記住f# 編譯器不能直接使用.fsl 和 .fsy 檔案,需要用fslex.exe 和 fsyacc.exe 進行編譯,建立.fs 檔案,然後才能使用。通常,使用預編譯事件實現,它在 visual studio 的專案屬性對話方塊中。

為了使用自己的詞法分析器,首先需要建立lexbuffer,表示處理的文字。lexbuffer 類有大量的靜態方法,能夠從不同的文字源中建立它的例項,它們包括frombinaryreader, frombytes, fromchars, and fromtextreader。典型的從字串建立 lexbuffer類,使用 encoding 類把字串編碼成位元組陣列,然後,呼叫靜態方法frombytes。

下面的例子顯示了詞法分析器的行為。假設,我們已經把詞法分析器編譯成乙個模組lex,那麼,我們使用token 函式去找第乙個字串中的符號,在這裡只有乙個。

open system.text

open microsoft.fsharp.text.lexing

let lexbuf = lexbuffer.frombytes(encoding.ascii.getbytes("1"))

let token = lex.tokenlexbuf

printfn "%a" token

例子的結果如下:

float 1.0

只能從緩衝中獲取第乙個符號,並沒有太大的價值,因此,以標準模式使用詞法分析器,更為常見的做法是建立迴圈,從緩衝中重複獲取所有的符號。下面的例子就演示了這一做法,輸出所有發現的符號:

open system.text

open system.fsharp.text.lexing

let lexbuf2 = lexbuffer.frombytes(encoding.ascii.getbytes("(1 * 1) + 2"))

while notlexbuf2.ispastendofstream do

let token = lex.token lexbuf2

printfn "%a" token

執行結果如下:

lparen

float 1.0

multi

float 1.0

rparen

plus

float 2.0

eof更加常見的做法,是把詞法分析器與解析器模組結合在一起使用。由解析器產生的函式期待第乙個引數成為函式,接收引數lexbuffer,然後轉換成符號(在這裡,lexbuffer<'a,'cty> -> pars.token)。很幸運,這就是我們的詞法分析器的 token 函式的簽名。下面的例子演示如何實現:

open system.text

openmicrosoft.fsharp.text.lexing

openstrangelights.expressionparser

let lexbuf3 =

lexbuffer.frombytes(encoding.ascii.getbytes("(1 * 1) + 2"))

let e =pars.expression lex.token lexbuf3

printfn "%a" e

示例的執行結果如下:

plus (multi (val 1.0,val 1.0),val 2.0)

正是如此。一旦有了自己的抽象語法樹,語法就有了好的抽象形式,因此,現在就能建立根據樹而行動的程式。到這裡,我們可能會想跳回前一章,再看一看如何轉換抽象語法樹,是通過解釋還是編譯。

指令碼解析器

指令碼解析器 命令指令碼解析器,自建立一種指令碼語法,解釋執行它。目前指令碼形式類似於命令,沒有變數型別的概念,關鍵字為 if else while break continue 解釋與c語言一樣。上傳 型別 無型別,全為字串看待。作用域 當前大括號中,以及所有子大括號中,退出當前大括號則清除變數。...

網頁解析器

學習任務 1.認識網頁解析器 學習目標 知識目標 1.熟悉網頁解析器 能力目標 1.能夠自主編寫網頁解析器 獲取新url函式 獲取新的url def get new urls self,page url,soup 儲存url new urls set 獲取所有的url 獲取每乙個url new ur...

XML解析器 TinyXML 的使用

xml解析器 tinyxml 的使用 xml 解析器 tinyxml 的使用 參考http www.cppblog.com dyj057 archive 2007 01 26 18007.html 我是在vc下編譯執行。1.tinyxml 庫的檔案 這裡給出鏈結 2.把所有的東西放到乙個找的著的地方...