Parsing 解析两种具有优先级的语句
我想将Parsing 解析两种具有优先级的语句,parsing,ocaml,ocamlyacc,Parsing,Ocaml,Ocamlyacc,我想将f(arg).method和f(arg)解析为block_语句;前者比后者更优先 parser.mly中的以下元素不能解析f(arg),但可以解析f(arg)。方法如下所示: (* f(arg).method *) BS_MAE MAE_LE_UN ( LE_IE IE_LE_AL ( LE_SNE SNE_I f, AL_I arg), UN_I method) BS_I_E ( f, E_LE LE_SNE SNE_
f(arg).method
和f(arg)
解析为block_语句
;前者比后者更优先
parser.mly中的以下元素不能解析f(arg)
,但可以解析f(arg)。方法如下所示:
(* f(arg).method *)
BS_MAE MAE_LE_UN (
LE_IE IE_LE_AL (
LE_SNE SNE_I f,
AL_I arg),
UN_I method)
BS_I_E (
f,
E_LE LE_SNE SNE_I arg)
(*parser.mly:*)
但是如果我们为block_语句
附加另一行|标识符LPAREN表达式RPAREN{BS_I_E($1,$3)}
,这一次它可以如下解析f(arg)
:
(* f(arg).method *)
BS_MAE MAE_LE_UN (
LE_IE IE_LE_AL (
LE_SNE SNE_I f,
AL_I arg),
UN_I method)
BS_I_E (
f,
E_LE LE_SNE SNE_I arg)
然而,这一次,f(arg).method
无法再被解析。读取
我不知道如何让解析器进一步阅读f(arg);我真的需要解析器来解析这两条语句。。。有人能帮忙吗?我会尝试一种结构如下的语法:
block:
| expr
expr:
| expr LPAREN argument_list RPAREN
| expr DOT unrestricted_name
| simple_expr
simple_expr:
| IDENTIFIER
请注意,如果您想要解析完整的句子,而不仅仅是输入的有效前缀,那么顶级规则应该请求存在EOF标记(以强制解析器转到输入的末尾):
%start main
主要内容:
|b=块EOF{b}
谢谢:-)。。。您确定可以很好地解析f(arg).method
.method
必须读作DOT unrestricted\u name
,因此f(arg)
必须读作member\u access\u expr
,但只有call\u expr
的另一个分支包含括号……事实上,我从解析示例开始,做了一个更改,结果语法是错误的。我对其进行了更新,将这两个级别合并,以允许解析。请注意,您必须有一个到达EOF的顶级解析规则(否则您可能会得到一个有效解析的输入前缀),并且f(x).y(z)
将被解析为(f(x).y)(z)
,正如我所想的那样。请您详细说明一下您必须有一个最高可达EOF的解析规则(否则您可能会得到一个有效解析的输入前缀)
?此外,我在你的语法中也看不到EOF。。。我想这是解决我问题的关键:根据我的语法f(arg)。方法无法解析,因为f(arg)
作为前缀是有效的解析…我编辑了我的答案,添加了一个EOF需求的示例。实际上,问题是我的整个语法都很复杂(我已经删除了很多分支机构,以使该职位成为该职位的代表),而这不是LR(1)
,因此重新构造它并不容易…但我仍然必须修改它以增加它所处理的程序…我找到了另一种方法来处理这篇文章中的特定问题,通过创建标识符子集,但我发布了另一个问题。。。