Please carry me. I am not a coding specialist.
I built the grammar in ANTLR4 using ANTRWorks 2. I tested the grammar with various test strings, and it works well in it. Now I am having problems using the generated lexer and parser in my own code. I use Java as the goal of code generation.
Here is the code I'm trying to do:
String s = "query(std::map .find(x) == y): bla";
ANTLRInputStream input = new ANTLRInputStream(s);
TokenStream tokens = new CommonTokenStream(new pqlcLexer(input));
pqlcParser parser = new pqlcParser(tokens);
ParseTree tree = parser.query();
System.out.println(tree.toStringTree());
The result of this is just a “request”, which is my starting rule. I would expect something like output from ANTLRworks: "(query (quant_expr query ((match std :: map. Find ((cm x)) == (cm (number 256)))): (query (qexpr bla) ))) "Here is the tree visually: http://puu.sh/94Nlx/00dc35bb05.png
, ?
Parser : http://pastebin.com/Lb34TyRW :
EXISTS: 'exists';
REDUCE: 'reduce';
QUERY: 'query';
INT: 'int';
DOUBLE: 'double';
CONST: 'const';
STDVECTOR: 'std::vector';
STDMAP: 'std::map';
STDSET: 'std::set';
INTEGER_LITERAL : (DIGIT)+ ;
fragment DIGIT: '0'..'9';
DOUBLE_LITERAL : DIGIT '.' DIGIT+;
LPAREN : '(';
RPAREN : ')';
LBRACK : '[';
RBRACK : ']';
DOT : '.';
EQUAL : '==';
LE : '<=';
GE : '>=';
GT : '>';
LT : '<';
ADD : '+';
MUL : '*';
AND : '&&';
COLON : ':';
IDENTIFIER : JavaLetter JavaLetterOrDigit*;
fragment JavaLetter : [a-zA-Z$_];
fragment JavaLetterOrDigit : [a-zA-Z0-9$_];
WS
: [ \t\r\n\u000C]+ -> skip
;
COMMENT
: '/*' .*? '*/' -> skip
;
LINE_COMMENT
: '//' ~[\r\n]* -> skip
;
query :
quant_expr
| qexpr+
| IDENTIFIER
| numeral
;
c_type : INT | DOUBLE | CONST;
bin_op: AND | ADD | MUL | EQUAL | LT | GT | LE| GE;
qexpr:
LPAREN query RPAREN bin_op_query?
| IDENTIFIER bin_op_query?
| numeral bin_op_query?
| quant_expr bin_op_query?
| IDENTIFIER find_query?
| numeral find_query?
| quant_expr find_query?
| IDENTIFIER array_query?
| numeral array_query?
| quant_expr array_query?
;
bin_op_query: bin_op query bin_op_query?;
find_query: '.''find' LPAREN query RPAREN;
array_query: LBRACK query RBRACK;
quant_expr:
quant id ':' query
| QUERY LPAREN match RPAREN ':' query
| REDUCE LPAREN IDENTIFIER RPAREN id ':' query
;
match:
STDVECTOR LBRACK id RBRACK EQUAL cm
| STDMAP '.''find' LPAREN cm RPAREN EQUAL cm
| STDSET '.''find' LPAREN cm RPAREN
;
cm:
IDENTIFIER
| numeral
;
quant :
EXISTS;
id :
c_type IDENTIFIER
| IDENTIFIER
;
numeral :
INTEGER_LITERAL
| DOUBLE_LITERAL
;