문제

I would like to parse and read a closure value in a simple text line like this:

1 !something

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

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

EXCLAMATION
    :   '!';

What I get in myText variable is just the final 'g' of 'something' because as can see in generated code myText is rewrited in a while loop for each occurence of ~('\r\n').

My answer is: is there any elegant way to read the 'something' value to the variable 'myText'?

TIA

도움이 되었습니까?

해결책

Inside parser rules, the ~ does not negate characters, but tokens. So ~('\r\n') would match any token other than the literal '\r\n' token (in your example, that would be a NUMBER or EXCLAMATION).

The lexer cannot be "driven" by the parser: after the parser matched a NUMBER and a EXCLAMATION, you can't tell the lexer to produce some other tokens than it has previously done. The lexer will always produce tokens based on some simple rules, regardless of what the parser "needs".

In other words: you can't handle this in the parser.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top