[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