[antlr-interest] Simple grammar tree problem
Martijn Reuvers
martijn.reuvers at gmail.com
Sat Apr 18 13:55:02 PDT 2009
Hello everyone,
I am new to this mailing list and new to antlr as well.
I am trying something simple (I think), but I keep getting an error
and I don't see why it says so. It must be something trivial, so I
hope one of you just sees what I am doing wrong. The parser/tree
should parse something simple like: %where% name="hello"
Grammar and tree grammar are below the mail.
In fact it does that it prints out the ast tree: (TEST %where% (= name
"hello")), see the @after in the grammer. But when I run the following
testcode:
ANTLRInputStream input = new ANTLRInputStream(System.in);
SqlUpperLexer lexer = new SqlUpperLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
SqlUpperParser parser = new SqlUpperParser(tokens);
CommonTree tree = (CommonTree) parser.sqlquery().getTree();
CommonTreeNodeStream treeStream = new CommonTreeNodeStream(tree);
treeStream.setTokenStream(tokens);
TreeSqlUpper eval = new TreeSqlUpper(treeStream);
eval.sqlquery();
And then on the input enter: %where% name="hello", it says:
src/antlr/basic/test06/TreeSqlUpper.g: node from line 1:13 no viable
alternative at input '='
I don't see what is wrong, as after the = a text between " " should
follow which is the case. I hope someone can help me out or point me
in the right direction. Thanks a lot!
Best Regards,
Martijn
---------------------------
Grammar:
---------------------------
grammar SqlUpper;
options {
output=AST;
}
tokens {
TEST;
}
@lexer::header {
package basic.test06;
}
@parser::header {
package basic.test06;
}
sqlquery
@after {
System.out.println(((CommonTree)$sqlquery.tree).toStringTree());
}
: KEYWORD_WHERE where_statement -> ^(TEST KEYWORD_WHERE where_statement)
;
where_statement
: l=TEXT o=comp_oper r=STRTEXT s=optional_where?
-> ^($o $l $r $s?)
| l=TEXT b=KEYWORD_NOT_LIKE r=STRTEXT s=optional_where?
-> ^($b $l $r $s?)
| l=TEXT b=KEYWORD_LIKE r=STRTEXT s=optional_where?
-> ^($b $l $r $s?)
| '(' l=TEXT o=comp_oper r=STRTEXT ')' s=optional_where?
-> ^($o $l $r $s?)
| '(' l=TEXT b=KEYWORD_NOT_LIKE r=STRTEXT ')' s=optional_where?
-> ^($b $l $r $s?)
| '(' l=TEXT b=KEYWORD_LIKE r=STRTEXT ')' s=optional_where?
-> ^($b $l $r $s?)
| '(' l=TEXT o=comp_oper r=STRTEXT s=optional_where ')' -> ^($o $l $r $s)
| '(' l=TEXT b=KEYWORD_NOT_LIKE r=STRTEXT s=optional_where ')' ->
^($b $l $r $s)
| '(' l=TEXT b=KEYWORD_LIKE r=STRTEXT s=optional_where ')' -> ^($b
$l $r $s)
;
optional_where
: KEYWORD_AND_OR where_statement -> ^(KEYWORD_AND_OR where_statement)
| '(' KEYWORD_AND_OR where_statement ')' -> ^(KEYWORD_AND_OR where_statement)
;
KEYWORD_NOT_LIKE
: '%notlike%'
;
KEYWORD_LIKE
: '%like%'
;
KEYWORD_AND_OR
: '%and%' | '%or%'
;
KEYWORD_WHERE
: '%where%'
;
STRTEXT
: '"' TEXT '"'
;
comp_oper
: EQ
| NEQ
;
EQ
: '='
;
NEQ
: '!='
;
TEXT
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '-')+
;
WS
: (' '|'\t'|'\n'|'\r')+ { skip();}
;
------------------------
Tree grammar
-----------------------
tree grammar TreeSqlUpper;
options {
tokenVocab=SqlUpper;
ASTLabelType=CommonTree;
}
@header {
package basic.test06;
}
sqlquery
@after {
System.out.println("");
}
: ^(TEST KEYWORD_WHERE where_statement)
;
where_statement
: ^(TEXT comp_oper STRTEXT optional_where?)
| ^(TEXT KEYWORD_NOT_LIKE STRTEXT optional_where?)
| ^(TEXT KEYWORD_LIKE STRTEXT optional_where?)
;
comp_oper
: EQ
| NEQ
;
optional_where
: ^(KEYWORD_AND_OR where_statement)
;
keyword_where_r
: KEYWORD_WHERE
;
text_r
: TEXT
;
More information about the antlr-interest
mailing list