简体   繁体   中英

ANTLR4 : Island grammar, token matching / skipping

If fighting an island grammar with antlr4, and while I can make it work, I still have doubts if this is the "proper" way.

I need to parse :

Some random text
{ }

@if(condition) {
   more random text
   @foobar
   @if (condition2) {
        random text {}
   }
}

The problem lies within the context : An "wild" {} isn't anything, but if it's a { } behind a language operator, the { } become meaningful. (read : It opens and closes a block)

In the above case, it would return the following, assuming that condition and condition2 are both true :

Some random text
{}
more random text
random text {}

I'm confused on which route to pick, any advice on the above ?

The original implementation seems to be matching braces :

{ }

@if (true) {
    { 
    foo 
    bar  
    } }

yields

{ }
{
foo
bar
}

while

{ }

@if (true) {
{ 
    foo 
    bar  
    }

yields a parse error.

this can be solved with a context specific lexer. In this case, by keeping track of the condition / block openings, we can determine if this is template content, or an actual block opening / closing.

See p219 of the ANTLR4 definitive ANTLR4 reference.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM