文字符號化:fslex
文字符號化(tokenizing,有時也叫詞法分析,lexical analysis 或 lexing),其基本意思是把文字分成可管理的塊(lump),或符號(token)。要用到工具fslex.exe,它本身就是建立詞法分析器(有時也叫掃瞄器,scanner),進行文字符號化的程式或模組的特定域語言。fslex.exe 是命令列程式,接收引數是表示詞法分析器的文字檔案,轉換成 f# 檔案,實現分析器。
fslex.exe 檔案的副檔名 .fsl。檔案有乙個可選的頭,放在大括號({}),是純 f# **,通常用於引用模組,或者可能是定義輔助函式(helper function);其餘部分定義正規表示式,組成詞法分析器。可以用關鍵字let 把正規表示式繫結到識別符號,如:
let digit = ['0'-'9']
或者把正規表示式定義為規則的一部分。規則(rule)是正規表示式的集合,它以競爭方式匹配文字部分。規則的定義,使用關鍵字rule,加規則名,加等號,加關鍵字parse;接下來是正規表示式的定義,應該加乙個動作,用大括號括起來的 f# 表示式。每個規則用豎線(|)隔開。每個規則根據文字流的匹配情況,將會變成乙個函式。如果找到乙個匹配,就觸發這個規則,並執行f# 表示式;如果有幾個正規表示式都匹配這個規則,那麼,使用最長的匹配。函式的返回值也就是動作的返回值,因此,每個動作的型別必須相同;如果沒有找到匹配,就會引發異常。
雖然動作可以是任何有效的 f# 表示式,但是,通常應該返回將用在fsyacc 檔案中的符號宣告,詳細內容看下一節「生成解析器:fsyacc」。如果想使用自身的詞法分析器,可以在這兒放任意想發生的邏輯,例如,把符號寫到控制台,或者把找到的符號儲存在列表中。
下面的例子就顯示了這樣的檔案,它能將小語言符號化。通常做動作中兩件事的其中之一。如果對匹配感興趣,那麼就返回在解析器檔案中定義的符號,都是大寫字母的識別符號,比如 rparen or multi;如果不感興趣,就用專門的值 lexbuf 去呼叫token 函式,以再次啟動解析。lexbuf 值會自動放在解析器定義中,表示文字流已經處理過了,它的型別是microsoft.fsharp.tools.fslex.lexbuffer。還要注意,如果真正感興趣的是發現值的位置,而不是找到的值,那麼,可以用函式curlexeme,獲取表示 lexbuf 匹配的字串。
let digit = ['0'-'9']
let whitespace = [' '
'\t' ]
let newline = ('\n' | '\r'
'\n')
rule token = parse
| whitespace
| newline
| "("
| ")"
| "*"
| "/"
| "+"
| "-"
| ['a'-'z' 'a'-'z' '_']+
| ['-']?digit+('.'digit+)?(['e''e']digit+)?
| eof
乙個詞法分析器可以包含幾個規則,更多的規則之間用關鍵字and 分隔,加規則名,加等號,加關鍵字parse;之後,是組成這個規則的正規表示式定義。這通常用於在語言中實現注釋。注釋常常會產生詞法解析器錯誤,因為注釋中可以包含任意文字。為了解決這個問題,當檢測到注釋開始的符號時,通常就切換到另外的規則,只查詢注釋結束的符號,而忽略其他所有的輸入。
下面的例子是乙個簡單的解析器,既可以找出像 f# 識別符號的字串,也能捨棄 c# 風格的多行注釋。注意,當找到注釋開始時,呼叫comment 函式以跳轉到comment 規則,找到注釋的結束,返回空,跳出。
rule token = parse
| "/*"
| ['_''a'-'z''a'-'z']['_''a'-'z''a'-'z''0'-'9']*
and comment = parse
| "*/" |eof
| _
iOS 崩潰符號化
1.符號表是什麼?dsym檔案其實是乙個目錄,在子目錄中包含了乙個16進製制的儲存函式位址對映資訊的中轉檔案,所有debug的symbols都在這個檔案中 包括檔名 函式名 行號等 所以也稱之為除錯符號資訊檔案。注意 來檢查 那如何知道crash檔案的uuid呢?可以用 grep 那麼,問題就來了!...
C MapwinGIS符號化配置
背景 基於c 進行mapwingis開發,現在需要對管點管線資料進行符號化。之前通過工程檔案來載入資料和符號化,現在資料單獨載入 sqlserver 符號化也要單獨載入 符號配置檔案 基於style配置檔案對資料進行符號化。管線通過defaultdrawingoptions對其進行符號化。管點基於附...
Crash日誌符號化
1.符號化crash日誌需要3樣東西 1 crash日誌本身 如 example.crash 從xcode的organizer匯出或者來自itunes connect.3 crash日誌多對應的.dsym包 2.開始符號化之前,先檢查一下以上3樣東西是否相對應 uuid crash日誌中可以看到類似...