这个 ANTLR 语法有什么问题?

埃里克 '3ToedSloth'

我想解析如下所示的查询表达式:

人名=%约翰%

(人名=约翰%,地址=%安大略%)

人 Fullname_3="约翰 C. 史密斯"

但我对 Antlr4 完全陌生,甚至无法弄清楚如何解析一个 TABLE FIELD=QUERY 子句。当我在 Go 作为目标运行下面的语法时,我得到

line 1:7 mismatched input 'Name' expecting {'not', '(', FIELDNAME} 

对于一个简单的查询,如

人名=约翰

为什么语法不能通过解析fieldsearch->field EQ searchterm->FIELDNAME来解析FIELDNAME?

我想我误解了这里关于 Antlr 语法如何工作的一些非常基本的东西,但是什么?

/* ANTLR Grammar for Minidb Query Language */

grammar Mdb;

start : searchclause EOF ;

searchclause
    : table expr
    ;

expr
    : fieldsearch
    | unop fieldsearch
    | LPAREN expr relop expr RPAREN
    ;

unop
    : NOT
    ;

relop
    : AND
    | OR
    ;

fieldsearch
    : field EQ searchterm
    ;

field
    : FIELDNAME
    ;

table
    : TABLENAME
    ;

searchterm
    : STRING
    ;

AND
    : 'and'
    ;

OR
    : 'or'
    ;

NOT
    : 'not'
    ;
EQ
    : '='
    ;

LPAREN
    : '('
    ;

RPAREN
    : ')'
    ;

fragment VALID_ID_START
    : ('a' .. 'z') | ('A' .. 'Z') | '_'
    ;

fragment VALID_ID_CHAR
    : VALID_ID_START | ('0' .. '9')
    ;

TABLENAME
    : VALID_ID_START VALID_ID_CHAR*
    ;

FIELDNAME
    : VALID_ID_START VALID_ID_CHAR*
    ;

STRING: '"' ~('\n'|'"')* ('"' | { panic("syntax-error - unterminated string literal") } ) ;

WS
   : [ \r\n\t] + -> skip
;
sepp2k

尝试使用grun Mdb tokens -tokens. 它会告诉您输入由两个表名、一个等号和另一个表名组成。要匹配您的语法,它需要是一个表名、一个字段名、一个等号和一个字符串

第一个问题是TABLENAMEFIELDNAME具有完全相同的定义。如果两个词法分析器规则会在当前输入上产生相同长度的匹配,则 ANTLR 更喜欢语法中第一个出现的规则。所以它永远不会产生FIELDNAME令牌。要解决这个问题,只需用一个ID规则替换这两个规则。如果你愿意,你可以引入解析器规则tableName : ID ;fieldName : ID ;如果你想保留名称。

另一个问题更直接:John根本不匹配您对字符串的规则,因为它不在引号中。如果您确实希望允许John作为有效的搜索词,您可能希望将其定义为searchterm : STRING | ID ;而不是仅允许STRINGs。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

这个Bison语法有什么问题?

来自分类Dev

这个Gradle语法有什么问题?

来自分类Dev

这个Bison语法有什么问题?

来自分类Dev

这个 for Loop 语法有什么问题?

来自分类Dev

这个简单的Python列表的语法有什么问题?

来自分类Dev

这个MySQL查询日期的语法有什么问题?

来自分类Dev

这个sqlite代码的语法有什么问题?

来自分类Dev

这个 SQL 命令的语法有什么问题

来自分类Dev

这个GStreamer管道有什么问题?

来自分类Dev

这个xsl:key有什么问题?

来自分类Dev

这个ANDEngine HUD有什么问题?

来自分类Dev

这个lua编码有什么问题?

来自分类Dev

这个dockerfile有什么问题

来自分类Dev

这个grep命令有什么问题?

来自分类Dev

这个续集查询有什么问题

来自分类Dev

这个Unban命令有什么问题

来自分类Dev

这个C代码有什么问题?

来自分类Dev

这个python命令有什么问题?

来自分类Dev

这个脚本有什么问题?

来自分类Dev

这个简单的登录有什么问题

来自分类Dev

这个Java HashMap有什么问题?

来自分类Dev

这个PHP函数有什么问题?

来自分类Dev

这个Linq查询有什么问题

来自分类Dev

这个while循环有什么问题?

来自分类Dev

这个glsl代码有什么问题?

来自分类Dev

这个grep有什么问题?

来自分类Dev

这个Ebean请求有什么问题

来自分类Dev

这个PDO脚本有什么问题

来自分类Dev

这个python代码有什么问题