質問

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