找回密码
 立即注册
搜索
查看: 1174|回复: 0

[软件] 请教些Antlr的问题

[复制链接]
     
发表于 2014-1-9 15:13 | 显示全部楼层 |阅读模式
本帖最后由 EraserKing 于 2014-1-9 15:15 编辑

现在一个编程语言,只要提取里面的查询部分,其它的部分忽略掉,于是就想到了用Antlr来做。
查询部分的语法是这样的(不是SQL啊!)
  1. FIND FIRST table1 WHERE
  2.    table1.field1 = value 1 AND
  3.    table2.field2 = value 2
  4.    NO-LOCK.
复制代码
当然左式和右式也可以是表达式,或者是一个单独的值,里面也可以用括号什么的,AND也能用OR代替,大致就是这样。

环境是Antlr 3.5.1配合Eclipse下的IDE插件,Antlrworks不知道为何跑不起来,也没多试了
下面的是我目前的代码,新手请轻喷
  1. fragment DIGIT :('0'..'9');
  2. fragment CHAR :('a'..'z'|'A'..'Z');

  3. STRING: '"' ( ~('\\'|'"') )* '"';
  4. NUMBER: ('0'..'9')+;
  5. FLOAT: NUMBER '.' NUMBER;
  6. BOOL: ('YES' | 'NO' | 'TRUE' | 'FALSE');
  7. DATE: (DIGIT DIGIT '/' DIGIT DIGIT '/' DIGIT DIGIT DIGIT DIGIT);

  8. ID: ('a'..'z'|'A'..'Z')(CHAR | DIGIT | '-' | '_' )* ;
  9. FUNCTION: ('a'..'z'|'A'..'Z')(CHAR | DIGIT | '-' | '_' )* '(' ( ~(')') )* ')';

  10. OPERATOR: '+' | '-' | '*' | '/';

  11. COMMAND: 'FOR' | 'FIND';
  12. POSITION: 'FIRST' | 'EACH' | 'LAST' | 'PREV';

  13. COMPARE: '=' | '<' | '>' | '<=' | '>=' | 'BEGINS';
  14. ANDOR: 'AND' | 'OR';
  15. LOCKERROR: 'NO-LOCK' | 'EXCLUSIVE-LOCK' | 'NO-ERROR';
  16. ENDSIGN: ':' | '.';

  17. LBRACE: '(';
  18. RBRACE: ')';

  19. atom: (ID '.' ID | ID | STRING | BOOL | DATE | NUMBER | FLOAT | FUNCTION);
  20. element: (atom|elementInBracket) (OPERATOR (atom|elementInBracket))* ;
  21. elementInBracket: LBRACE element RBRACE;

  22. sentence: ('NOT')? (element (COMPARE element)?|sentenceInBracket);
  23. sentenceInBracket: LBRACE sentence RBRACE;


  24. COMMENT: ('/*' .*? '*/') -> channel(HIDDEN);
  25. 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"'

希望各位高手能给点建议 谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-9-8 12:32 , Processed in 0.025698 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表