我有以下语法:
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”这样的字符串。 我以为我可以用句法谓词功能解决这个“路径”问题。也许我在这里做错了,我必须重新定义语法。对此问题的任何建议?
答案 0 :(得分:3)
你必须明白语法谓词不会导致解析器给词法分析器一些方向w.r.t.解析器“想要”检索的标记。语法谓词用于强制解析器在现有令牌流中向前看以解决歧义(强调“现有”:解析器无法控制创建的令牌!)。
词法分析器独立于解析器运行,以系统的方式创建令牌:
因此,在您的情况下,给定输入"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 : '/';