簡體   English   中英

Antlr句法謂詞沒有匹配

[英]Antlr syntactic predicate no matching

我有以下語法:

rule  : (PATH)=> (PATH) SLASH WORD
   {System.out.println("file: " + $WORD.text + " path: " + $PATH.text);};
WORD  : ('a'..'z')+;
SLASH   : '/';
PATH    : (WORD SLASH)* WORD;

但它不適用於像“a / b / c / filename”這樣的字符串。 我以為我可以用句法謂詞功能解決這個“路徑”問題。 也許我在這里做錯了,我必須重新定義語法。 對此問題的任何建議?

您必須了解語法謂詞不會導致解析器為詞法分析器提供某種方向,即解析器“想要”檢索的標記。 語法謂詞用於強制解析器在現有令牌流中向前看以解決歧義(強調“現有”:解析器無法控制創建的令牌!)。

詞法分析器獨立於解析器運行,以系統方式創建令牌:

  1. 它試圖匹配盡可能多的角色;
  2. 只要2(或更多)規則匹配相同數量的字符,首先定義的規則將優先於稍后定義的規則。

因此,在您的情況下,給定輸入"a/b/c/filename" ,詞法分析器將貪婪地將整個輸入匹配為單個PATH令牌。

如果要獲取文件名,請從PATH檢索它:

rule  : PATH
        {
         String file = $PATH.text.substring($PATH.text.lastIndexOf('/') + 1);
         System.out.println("file: " + file + ", path: " + $PATH.text);
        }
      ;
WORD  : ('a'..'z')+;
SLASH : '/';
PATH  : (WORD SLASH)* WORD;

或創建與路徑匹配的解析器規則:

rule  : dir WORD
        {
         System.out.println("file: " + $WORD.text + ", dir: " + $dir.text);
        }
      ;
dir   : (WORD SLASH)+;
WORD  : ('a'..'z')+;
SLASH : '/';

暫無
暫無

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

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