具有ANTLR4語法,匹配輸入和生成的分析樹。是否有任何方法可以找到關於解析樹中的節點的定義(如果有的話)定義了哪種量詞?查詢ANTLR4解析樹是否在語法規則中量化了兒童
一個例子:具有這樣的語法:
開始: 'A'( 'B' | 'c')中* 'd';
輸入:「ABCD」
解析輸入後,「開始」規則的解析樹將有4點終端的孩子。問題是,是否有任何方法可以找出第二和第三個孩子('b'和'c')他們是可選的?
具有ANTLR4語法,匹配輸入和生成的分析樹。是否有任何方法可以找到關於解析樹中的節點的定義(如果有的話)定義了哪種量詞?查詢ANTLR4解析樹是否在語法規則中量化了兒童
一個例子:具有這樣的語法:
開始: 'A'( 'B' | 'c')中* 'd';
輸入:「ABCD」
解析輸入後,「開始」規則的解析樹將有4點終端的孩子。問題是,是否有任何方法可以找出第二和第三個孩子('b'和'c')他們是可選的?
一個簡單的方法來確定一個可選的subterm是否存在是使用標籤
start : 'a' op+=('b' | 'c')* 'd' ;
這將導致解析樹上下文StartContext
具有場
List<TerminalNode> op;
如果爲null,沒有b
或匹配c
。否則,op
將包含匹配順序中的b
和c
實例的列表。
更新
標籤將使解析樹結構,以提供線索,以什麼subterms是可選的,但即使是這樣的信息是不完整的。
沒有標籤,分析樹只會標識匹配的內容和順序,而不是任何可能涉及的可選限定符。
您可以(1)使用ANTLR's own grammar解析語法本身,直接確定應用於特定子項的實際可選限定符;或者(2)適當地模糊輸入,並最終從乾淨生成的任何分析樹中推斷和限定可選子項。
「可選」量詞是語法的一部分。因此,無論何時您看到'b'或'c'匹配,它們都來自可選的子規則。我不明白你的問題 – JavaMan
好的,這裏有一些誤解。因此,我們的目標是找到匹配輸入中的那些部分,這些輸入不一定需要保持語法上的正確性,那就是找出量詞爲?,*或可能是+的那些部分。 – Reni