Parsing 使用最小分隔符分析列表

Parsing 使用最小分隔符分析列表,parsing,ocaml,grammar,language-theory,Parsing,Ocaml,Grammar,Language Theory,我的语言有4种语句:s00、s01、s10、s11,其中前导1表示初始关键字,尾随1表示终止,我有一个分隔符“;”。我可以用“;”终止任何语句。我想解析一种允许语句列表的语言,它允许最小限度地使用“;”。解析器是Dypgen,即GLR+ 例如: { x=1 fun f(){} x=1; x=1 var x=1 var x=1; x=1 } 有可能做到这一点吗?如果是,怎么做?若否,原因为何 我认为这是不可能的,主要是因为我想不出怎么做:) 然而,它似乎是上下文敏感的:规则是,如果a未终止,B未

我的语言有4种语句:s00、s01、s10、s11,其中前导1表示初始关键字,尾随1表示终止,我有一个分隔符“;”。我可以用“;”终止任何语句。我想解析一种允许语句列表的语言,它允许最小限度地使用“;”。解析器是Dypgen,即GLR+

例如:

{ x=1 fun f(){} x=1; x=1 var x=1 var x=1; x=1 }
有可能做到这一点吗?如果是,怎么做?若否,原因为何

我认为这是不可能的,主要是因为我想不出怎么做:) 然而,它似乎是上下文敏感的:规则是,如果a未终止,B未启动,则必须在a和B之间插入“;”,B和C也是如此,这意味着B使用了两次

然而,因为解析器是GLR+的,所以很容易使用它

(s00|s01|s10|s11}*

按照规则,如果它失误,则输入“;”(这是s11不可操作)以解决歧义。不过,如果解析器报告语法错误就更好了。也许这可以在合并alternate s产品时完成。真正的问题是当它们重叠而不是合并时:如果发生这种情况,程序解析可能会爆发。

我最近在顶级短语方面遇到类似的问题,其中一些短语需要终止
在前面的短语中,而其他(以短语开头的关键字)则不是。我将短语的句法类别一分为二,并为表达这种行为的短语序列提供了很好的规则,从而解决了我的问题。但这导致了分裂语法的重复

在您的情况下,它将类似于:

sequence:
  | (s00 | s10) sequence_closed
  | (s01 | s11) sequence_open
  | ε

sequence_closed:
  | s10 sequence_closed
  | s11 sequence_open
  | ';' sequence_open
  | ε

sequence_open:
  | s00 sequence_closed
  | s01 sequence_open
  | ε

如果您想允许使用多余的分隔符(您很可能希望这样做),这会有点复杂,但这正是您的想法。

Ah。。隐马尔可夫模型。。除了丑陋的事实之外,我在顶层有与内部列表语法相同的列表,所以我必须复制副本。。这实际上看起来相当不错。我不想对语言中的每一个“类似列表的结构”都这样做,但真正关心的是让语句级语法看起来更干净:纯粹的美学,或者嫉妒(如果Haskell和Ocaml也可以不使用分隔符的话,我想:)顺便说一句:;”事情表明你在考虑这样的问题:高级文本不能被提升到一个函数中,你必须使用单一的“。”支持“;”的唯一理由是REPL强制采取“;”不会采取的行动。