簡體   English   中英

ANTLR詞法分析器規則消耗過多

[英]ANTLR lexer rule consumes too much

ANTLR Lexer規則設計

我需要以下令牌:

  • 允許的字符包括大寫,小寫,數字,空格和連字符
  • 不固定長度(必須至少兩個字符)
  • 令牌必須至少包含一個空格或連字符
  • 令牌必須以大寫,小寫,數字,空格或連字符開頭和結尾(不能以空格開頭或結尾)

下面的語法中的ANTLR詞法分析器規則“ AlphaNumericSpaceHyphen”幾乎有效,除了一種情況。 使用解析器規則“ sic”進行測試,以下輸入將被解析(不帶引號):

“標准工業分類:水運輸[4400]”

以下輸入無法解析(不帶引號):

“標准工業分類:水運輸[4400]”

問題在於,詞法分析器規則“ AlphaNumericSpaceHyphen”占用了“ WATER TRANSPORTATION”之后的空間和左方括號,然后詞法分析器意識到沒有匹配項,因為它走得太遠了。

我已經嘗試過各種類型的謂詞,並且在沒有任何運氣的情況下向前看。 任何幫助是極大的贊賞。

grammar T;

sic: SICSpecifier AlphaNumericSpaceHyphen  LEFTBRACKET Digits RIGHTBRACKET;

LEFTBRACKET  
:   '[';  

RIGHTBRACKET 
:   ']';

SICSpecifier: 'STANDARD INDUSTRIAL CLASSIFICATION:';

WS : (' '|'\t')+ 
{   
  $channel = HIDDEN;  
};  

fragment UCASEALPHA : 'A'..'Z';
fragment LCASEALPHA : 'a'..'z';
fragment DIGIT : '0'..'9';
Digits: DIGIT+;

AlphaNumericSpaceHyphen 
:           (UCASEALPHA|LCASEALPHA |DIGIT|'-')+  (' ' (UCASEALPHA|LCASEALPHA |DIGIT|'-')+)+   
        |   (UCASEALPHA|LCASEALPHA |DIGIT)+ ('-')+  ((' '|UCASEALPHA|LCASEALPHA |DIGIT|'-')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?
        |   ('-')+ (UCASEALPHA|LCASEALPHA |DIGIT)+  ((UCASEALPHA|LCASEALPHA |DIGIT|'-'|' ')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?   
        ;

不幸的是,詞法分析器規則沒有回溯。 你可以看看

ANTLR詞法分析器規則即使不匹配也會消耗字符?

您可以嘗試調整您的語法,以便可以更改此解決方案中建議的標記的類型。

希望這會對您有所幫助。

暫無
暫無

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

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