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)
,因此重新构造它并不容易…但我仍然必须修改它以增加它所处理的程序…我找到了另一种方法来处理这篇文章中的特定问题,通过创建标识符子集,但我发布了另一个问题。。。