1

我想在一个简单的文本行中解析和读取一个闭包值,如下所示:

1 !某事

line
    :   (NUMBER EXCLAMATION myText=~('\r\n')*)
{ myFunction($myText.text); }

NUMBER
    :   '0'..'9'+;

EXCLAMATION
    :   '!';

我在myText变量中得到的只是 'something' 的最后一个 'g',因为在生成的代码中可以看到myText在每次出现~('\r\n')时都会在 while 循环中重写。

我的回答是:有没有什么优雅的方法可以读取变量“myText”的“某物”值?

TIA

4

1 回答 1

1

在解析器规则中,~不否定字符,而是令牌。所以~('\r\n')将匹配除文字标记以外的任何'\r\n'标记(在您的示例中,这将是 a NUMBERor EXCLAMATION)。

词法分析器不能由解析器“驱动”:在解析器匹配 aNUMBER和 a之后EXCLAMATION,您不能告诉词法分析器生成一些其他标记,而不是以前所做的。无论解析器“需要”什么,词法分析器总是会根据一些简单的规则生成标记。

换句话说:你不能在解析器中处理这个。

于 2013-04-09T17:54:23.270 回答