antlr4相關筆記
安裝,其中python-antlr4
可以產生適用於python的檔案
sudo pacman -S antlr4 python-antlr4
概念
- action
- 在語法裡面嵌入程式碼動作等等
產生適用於python的檔案
範例檔案可以查看 https://github.com/antlr/grammars-v4 並且根據裡面的語法寫下面一個 grammar.g4
antlr4 -Dlanguage=Python3 grammar.g4
如果要運行 parser 的話可以從文檔找到範例程式。
產生之後可以找到該檔案, Listener
檔案在進去與離開的時候,可以觸發各種行為,並且透過 getChild(index)
來取得該 Symbol,裡面 Symbol
ctx.getChild(1)
該方法透過 walker 進行處理
printer = ebnf_likeListener()
walker = ParseTreeWalker()
walker.walk(printer, tree)
亦可透過類似 yacc 的 action 寫法,在 rule 加入
{ print('1') }
之類的程式碼,達成執行的效果
如果要回傳資料
example returns [Type valuename]
: expr {$valuename = $expr.text}
;
而這個方式僅需要呼叫 Parser 的 root grammar
-
lexer rule:
- lexer 的規則以大寫作為開頭
-
parse tree
參考資料
header
使 Parser 與 Lexer 可以載入函數庫 how can I import other java lib with ANTLR4?
@lexer::header{...}
@parser::header{...}
repeat
重複的寫法如下
example
: (expr)*
;
example2
: (expr)+
;
中括號
只需要逃逸後面 ]
即可
Bracket
: [[\]]+
;
注意事項
為了避免 ARG_ACTION
不工作,確保把
Lexical rule 都放在後面
Troubles with returns declaration on the first parser rule in an ANTLR4 grammar
確保 lexical rule 都是大寫開頭
如果 lexical rule 有重疊的可能性,可能會導致無法正常找到 token
另外擺放的順序會影響到優先級,可以根據需求決定位置
System Program