【发布时间】:2014-05-02 00:48:03
【问题描述】:
我正在尝试为 Answer Set Programming (ASP) 方言编写解析器,就语法而言,它看起来像带有一些扩展的 Prolog。
例如,一种扩展是expansion,这意味着例如fact(1..3). 在fact(1). fact(2). fact(3). 中扩展。请注意,该语言可以理解 INT 和 FLOAT 数字并使用 . 也作为终止符。
在某些情况下,解析器无法区分整数、浮点数、扩展名和分隔符,因为我认为该语言显然是模棱两可的。在这种情况下,我必须用空格明确分隔标记。但是,任何 Prolog 或 ASP 解析器都可以正确处理此类产生式。我读到 ANTLR4 可以自动消除有问题的产品的歧义,但可能需要一些帮助,但我不知道该怎么做! ;-) 我读过类似here 和here 的东西,但显然它们没有帮助我。
有人能告诉我该怎么做才能克服这种歧义吗? 请注意,我无法更改语言,因为它非常标准。 为了简化专家的工作,我创建了一个最小的工作示例,如下所示。
grammar Test;
program:
statement* ;
statement: // DOT is the statement terminator
range DOT |
intNum DOT |
floatNum DOT ;
intNum: // not needed, but helps in TestRig
INT;
floatNum: // not needed, but helps in TestRig
FLOAT;
range: // defines an expansion
INT DOTS INT ;
DOTS: '..';
DOT: '.';
FLOAT: DIGIT+ '.' DIGIT* | '.' DIGIT+ ;
INT: DIGIT+ ;
WS: [ \t\r\n]+ -> skip ;
fragment NONZERO : [1-9] ;
fragment DIGIT : [0] | NONZERO ;
我使用以下输入:
1 .
1. .
1.5 .
.5 .
1 .. 5 .
1.
1..
1.5.
.5.
1..5.
我得到以下错误,这些错误被其他工具解析纠正:
line 8:0 extraneous input '1.' expecting '.'
line 11:2 extraneous input '.5' expecting '.'
提前非常感谢!
【问题讨论】:
-
这种语言真的接受
1.作为浮点数吗? Prolog 没有,这大大增加了您语言的歧义。 -
@Daniel Lyons 我没有意识到 Prolog 不接受
1.作为浮点数......我只是对浮点数进行了相当标准的定义。那么,您的建议是对浮点数使用以下产生式:float: DIGIT+ '.' DIGIT+;? -
我认为这会有所帮助,如果它受到伤害,我会感到震惊。
-
就这么简单!不知道如何将其标记为答案,因为您的只是评论...
-
现在是答案。 :)
标签: parsing prolog antlr4 answer-set-programming