我想在一个简单的文本行中解析并读取一个闭包值,如下所示:
1!
line
: (NUMBER EXCLAMATION myText=~('\r\n')*)
{ myFunction($myText.text); }
NUMBER
: '0'..'9'+;
EXCLAMATION
: '!';
我在 myText 变量中得到的只是'某事'的最终'g',因为在生成的代码中可以看到 myText 在每个循环中重新编译出现〜('\ r \ n')。
我的回答是:有没有优雅的方法来读取变量'myText'的'something'值?
TIA
答案 0 :(得分:1)
在解析器规则中,~
不会否定字符,而是取消令牌。因此,~('\r\n')
会匹配除文字'\r\n'
令牌之外的任何令牌(在您的示例中,这将是NUMBER
或EXCLAMATION
)。
解析器无法“驱动”词法分析器:在解析器匹配NUMBER
和EXCLAMATION
之后,您无法告诉词法分析器生成一些其他令牌,而不是之前完成的操作。不管解析器“需要什么”,词法分析器总是会根据some simple rules生成标记。
换句话说:你无法在解析器中处理它。