簡體   English   中英

當兩個規則都使用“==”時,如何實現解決歧義的 Antlr4 解析器?

[英]How do I implement a Antlr4 parser that resolve ambiguity when both rules use "=="?

我知道標題不夠清楚。 這是詳細信息。 我需要解析如下內容:

Client->iFrame.Initialise() {
  res = Server.loadStaticResource()
  if (res.status == 404 || res.status == 503) {  <1>
     throw Error()
  }
}
== Initialisation done! ==                       <2>
Client->iFrame.load(data) {
   moreStatements()
}

它是一種類似 Java 的語法,除了我們支持分隔符(在示例中顯示為== Initialisation done! == )。 注意:

  1. <1> 和 <2> 都使用==
  2. 僅當它出現在行的開頭(刪除空格后)時,它才會被視為分隔符。
  3. 開始==和結束==之間可以使用任何字符,但換行符除外。
  4. Divider 組件中可以有更多的= ,比如=== 3 equals ===

我應該如何實施?

要添加更多上下文,這將用於呈現如下所示的序列圖。 它是一個開源項目,可以在這里找到: https://github.com/ZenUml/core

分頻器的時序圖

我試過什么?

我一直在尋找一種在 Lexer 中使用前瞻的方法,但找不到任何好的例子。 我目前將開始==和結束==之間的內容限制為僅一個詞。

我的實現在這里:

  1. 解析器: https://github.com/ZenUml/core/blob/b84c9ca0a6d023c5e520bf83a225e4931db134fc/src/g4/sequenceParser.g4#L88-L89
  2. 詞法分析器: https://github.com/ZenUml/core/blob/main/src/g4/sequenceLexer.g4

好的,這是從問題和評論以及我長期以來編寫小解析器的經驗中得出的答案。

法則一:想辦法作弊

在這個問題中出現歧義的情況下,在詞法分析器中尋找解決方案可能是一個有用的探索途徑。 在這種情況下,因為換行符顯然具有某種程度的含義,所以引入一個匹配換行符后跟幾個=符號的標記意味着解析器看到一個標記(“換行符等於”)直接指示該生產的開始。

特定的“作弊”是一個\n==標記,因此語法可以將其作為分隔符或語句開始(任何有意義的)。 如果它以某種方式出現在語法中的一個奇怪點,解析器可能會拋出一個錯誤,指出“== 意外開始”,因為它知道那是正在發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM