簡體   English   中英

了解ANTLR4中的詞法分析器規則解析

[英]Understanding lexer rule resolution in ANTLR4

我正在閱讀ANTLR4防御指南,現在在有關詞法分析器規則解析的部分中。 這是本節中寫的:

grammar KeywordTest;
enumDef : 'enum' '{' ... '}';
...
FOR: 'for'
...
ID:[a-zA-Z]; // does not match 'enum' or 'for'

規則ID也可以匹配諸如enumfor關鍵詞,這意味着不止一個規則可以匹配同一字符串。 諸如'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.

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