ANTLR3: parameters and semantic predicates ("cannot find character", "illegal type start")

I would like to implement a "branch" in ANTLR3.

I decided to use

branch[boolean is_a]
    : ({ $is_a}? => a)
    | ({!$is_a}? => b);

I would do the trick, but I get compilation errors "I can’t find the character" and "type illegal start", because in the generated source, i.e. DFA45.specialStateTransition(...)has no parameter is_a.

I tried to exclude =>ΒΉ and / or omitting $of $is_a.

FIRST sets aand bdo not intersect.

Actually bhas a type ((C) => c) | a.

ΒΉ) since I do not understand the difference between {...}? => ...and{...}? ...

+3
source share
1 answer

100%, : . , is_a, !is_a. $is_a, is_a.

, , "". :

grammar T;

parse
@init{int n = 1;}
  :  (number[n\%4 == 0] {n++;})+ EOF
  ;


number [boolean multipleOf4]
  :  {multipleOf4}?=> Int {System.out.println("branch A -> " + $Int.text);}
  |                   Int {System.out.println("branch B :: " + $Int.text);}
  ;

Int
  :  '0'..'9'+
  ;

Space
  :  (' ' | '\t' | '\r' | '\n') {skip();}
  ;

( , % ANTLR- ( , ), )

:

import org.antlr.runtime.*;

public class Main {
    public static void main(String[] args) throws Exception {
        ANTLRStringStream in = new ANTLRStringStream("11 22 33 44 55 66 77 88 99");
        TLexer lexer = new TLexer(in);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TParser parser = new TParser(tokens);
        parser.parse();
    }
}

/ (A), (B) (C):

java -cp antlr-3.2.jar org.antlr.Tool T.g // A
javac -cp antlr-3.2.jar *.java            // B
java -cp .:antlr-3.2.jar Main             // C

( Windows , java -cp .;antlr-3.2.jar Main)

:

branch B :: 11
branch B :: 22
branch B :: 33
branch A -> 44
branch B :: 55
branch B :: 66
branch B :: 77
branch A -> 88
branch B :: 99

, , " " ({boolean}?=>), " " ({boolean}?). SO Q & A: " " ANTLR?

+3

Source: https://habr.com/ru/post/1791390/


All Articles