Antlr4

antlr4相關筆記

安裝,其中python-antlr4可以產生適用於python的檔案

sudo pacman -S antlr4 python-antlr4

概念

產生適用於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

參考資料

使 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