[英]Understanding lexer rule resolution in ANTLR4
我正在閱讀ANTLR4防御指南,現在在有關詞法分析器規則解析的部分中。 這是本節中寫的:
grammar KeywordTest;
enumDef : 'enum' '{' ... '}';
...
FOR: 'for'
...
ID:[a-zA-Z]; // does not match 'enum' or 'for'
規則ID也可以匹配諸如
enum
或for
關鍵詞,這意味着不止一個規則可以匹配同一字符串。 諸如'enum'
文字成為詞匯規則,並 在解析器規則之后但在顯式詞匯 規則 之前 。
這是什么意思?它如何幫助我們解決潛在的歧義? 我會說像
ENUM_KEYWORD: 'enum'
在規則enumDef: 'enum' '{' ... '}
之后, ATNLR4
可能在內部使用的對象將被自動enumDef: 'enum' '{' ... '}
,其外觀如下:
enumDef: ENUM_KEYWORD '{' ... '}
ENUM_KEYWORD: 'enum'
ANTLR4到底是怎么做的?
詞法分析器規則的順序在語法中非常重要,因為將使用找到的第一個適用規則。 您可以在這里閱讀更多內容。
因此,如果您有詞法分析器規則:
ID: [a-zA-Z]+;
FOR: 'for';
根據其訂單輸入,“ for”將被標記為FOR令牌或ID令牌,因為對於兩者而言都是正確的。
結果,語法經常包含規則“模糊”,其中提到了所有關鍵字,因此當另一個標記包含關鍵字時,它將通過。
例如:
alfaNum: (ALFA | NUM | ambigous | '_' )+?;
ambigous: SELECT | WHERE | FROM | WITH | SET | AS;
這樣,如果存在alfaNum令牌“選擇”,它將通過。 如果不指定歧義,它將對詞法分析器規則SELECT: 'select';
故障轉移SELECT: 'select';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.