javacc在stanfordnlp中的應用

總結:

這個javacc感覺比較複雜,在於stanfordnlp中

CoreMapExpressionExtractor這個太過複雜,只需要搞清楚如何寫正則就行了

格式就是

$DAYOFWEEK = "/monday|tuesday|wednesday|thursday|friday|saturday|sunday/"

$TIMEOFDAY = "/morning|afternoon|evening|night|noon|midnight/"

 

 

ENV.defaults["ruleType"] = "tokens"

{

    ruleType: "tokens",        #類型

    pattern: ( $DAYOFWEEK ),   #正則本身

    result: "TIME"             #如果匹配後如何生成nlg

}

一、javacc說明文檔

  • >>>紅色部分

parser_begin 和 parser_end
但是這也是一個聲明實例變量的好場所,該實例變量將由您結果中的 Java 語句引用。如果您喜歡,甚至可以在這裏插入 Java main() 過程,並且使用它來構建獨立的應用程序,以啓動和測試您正在生成的解析器

  • >>>綠色部分

綠色部分直接調用黃色函數
該操作作爲方法 Parser_1.integerLiteral() 的一部分產生。每當解析器遇到整數時,都執行該操作

  • >>>黃色部分函數

聲明瞭類型 Token (JavaCC 的內置類)的局部變量 t 。當在輸入流中遇到整數時會 觸發 該規則,該整數(象文本一樣)的值被賦給實例變量 t.image 。

  • >>>黑色部分

舉個例子
TOKEN : { < NUMBER : ([”0”-”9”])+ > }
說明([”0”-”9”])+. The [”0”- ”9”] part is a regular expression that matches any digit, that is, any character whose unicode encoding is between that of 0 and that of 9. A regular expression of the form (x)+ matches any sequence of one or more strings, each of which is matched by regular expression x. So the regular expression ([”0”-”9”])+ matches any sequence of one or more digits.

  • >>>執行流程

1. 最上面的方法 simpleLang() 調用 integerLiteral() 。
2. integerLiteral() 希望在輸入流中立即遇到一個整數,否則該表達式將無效。爲了驗證這一點,它調用記號賦予器(Tokenizer.java)以返回輸入流中的下一個記號。記號賦予器穿過輸入流,每次檢查一個字符,直到它遇到一個整數或者直至文件結束。如果是前者,則以 <INT> 記號將值“包”起來;如果是後者,則當作 <EOF> ;並將記號返回給 integerLiteral() 做進一步處理。如果記號賦予器未遇到這兩個記號,則返回詞法錯誤。
3. 如果記號賦予器返回的記號不是整數記號或 <EOF> ,那麼 integerLiteral()拋出 ParseException ,同時解析完成。
4. 如果它是整數記號,表達式仍然可能是有效的, integerLiteral() 再次調用記號賦予器以返回下一個記號。如果返回 <EOF> ,則由單個整數構成的整個表達式都是有效的,解析器將控制返還給調用應用程序。
5. 如果記號賦予器返回加號或減號記號,則表達式仍然是有效的,integerLiteral() 將最後一次調用記號賦予器,以尋找另一個整數。如果遇到一個整數,則表達式是有效的,解析器將完成工作。如果下一個記號不是整數,則解析器拋出異常。

二、stanfordnlp TokenSequenceParser.jj

然後直接調用   new TokenSequenceParser

 

看看上面定義的規則如何使用呢?如下

 

 

 

 

 

 

 

 最關鍵的函數是如下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章