繁体   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