请教些Antlr的问题
本帖最后由 EraserKing 于 2014-1-9 15:15 编辑现在一个编程语言,只要提取里面的查询部分,其它的部分忽略掉,于是就想到了用Antlr来做。
查询部分的语法是这样的(不是SQL啊!)FIND FIRST table1 WHERE
table1.field1 = value 1 AND
table2.field2 = value 2
NO-LOCK.当然左式和右式也可以是表达式,或者是一个单独的值,里面也可以用括号什么的,AND也能用OR代替,大致就是这样。
环境是Antlr 3.5.1配合Eclipse下的IDE插件,Antlrworks不知道为何跑不起来,也没多试了
下面的是我目前的代码,新手请轻喷fragment DIGIT :('0'..'9');
fragment CHAR :('a'..'z'|'A'..'Z');
STRING: '"' ( ~('\\'|'"') )* '"';
NUMBER: ('0'..'9')+;
FLOAT: NUMBER '.' NUMBER;
BOOL: ('YES' | 'NO' | 'TRUE' | 'FALSE');
DATE: (DIGIT DIGIT '/' DIGIT DIGIT '/' DIGIT DIGIT DIGIT DIGIT);
ID: ('a'..'z'|'A'..'Z')(CHAR | DIGIT | '-' | '_' )* ;
FUNCTION: ('a'..'z'|'A'..'Z')(CHAR | DIGIT | '-' | '_' )* '(' ( ~(')') )* ')';
OPERATOR: '+' | '-' | '*' | '/';
COMMAND: 'FOR' | 'FIND';
POSITION: 'FIRST' | 'EACH' | 'LAST' | 'PREV';
COMPARE: '=' | '<' | '>' | '<=' | '>=' | 'BEGINS';
ANDOR: 'AND' | 'OR';
LOCKERROR: 'NO-LOCK' | 'EXCLUSIVE-LOCK' | 'NO-ERROR';
ENDSIGN: ':' | '.';
LBRACE: '(';
RBRACE: ')';
atom: (ID '.' ID | ID | STRING | BOOL | DATE | NUMBER | FLOAT | FUNCTION);
element: (atom|elementInBracket) (OPERATOR (atom|elementInBracket))* ;
elementInBracket: LBRACE element RBRACE;
sentence: ('NOT')? (element (COMPARE element)?|sentenceInBracket);
sentenceInBracket: LBRACE sentence RBRACE;
COMMENT: ('/*' .*? '*/') -> channel(HIDDEN);
WS: ( ' ' | '\t' | '\r' | '\n' ) -> channel(HIDDEN);atom对应表达式的元素
element对应表达式,因为表达式可能仅仅是一个单独的值,或者是几个值的运算结果,所以 运算符和运算符右侧 是可选的
sentence对应一个判断条件,因为可能仅仅是一个表达式,也有可能是两个表达式相比较,所以从 比较运算符右侧 也是也选的
目前主要是在脱括号这时出了问题,而且我都不太摸得着头脑。
在element这层脱括号我没发现什么问题
比如给出表达式 1+(z+(x+1))*3
得到下面的结果
或者改成(1+(z+(x+1))*3),也没有问题
但是在sentence这里脱括号就有点让我奇怪了
比如给出这个判断条件 1+(z+(x+1))*3 = 1
没有问题,可以得结果如下
但是如果这个条件以括号开头,就死活匹配不上
比如把上面那个条件改成 (1+(z+(x+1))*3 = 1)
立马出错
NoViableAltException: line 1:0 no viable alternative at input '('
或者换用简单一点的条件,比如 NOT ("abc" = "def")
也是出错
NoViableAltException: line 1:3 no viable alternative at input '"abc"'
希望各位高手能给点建议 谢谢
页:
[1]