接受定义语言的每个前缀的Bison语法

时间:2016-04-09 19:39:44

标签: parsing bison

我尝试为Haskell语言编写一个解析器,另外需要注意的是,解析的程序可以是任何有效Haskell源代码的任何前缀。

例如,在我的情况下,这是有效的来源:

func x = (x +

这里有一个类似BNF的Haskell规范:https://www.haskell.org/onlinereport/syntax-iso.html#sect9.5

是否有将BNF语法转换为接受此类前缀语言的bison语法的示意方法?

本练习的上下文是Emacs编辑器,源代码是正在编写的程序,目标是在程序员编写源代码时提供缩进提示。

1 个答案:

答案 0 :(得分:1)

采用CFG并将其转换为符合所有前缀的语言的CFG非常直接:

  • 对于每个非终端,添加一个非终端的附加 - 前缀版本

  • 对于表单X := A B C的每个规则,添加表单X_prefix := A B C_prefix | A B | A B_prefix | A | A_prefix

  • 的规则
  • 删除所有引用terminal_prefix的规则,然后递归Y_prefix Y_prefix,其中package com.example.benjamin.labb3; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.SurfaceHolder; public class SurfaceView extends Activity { private OurView v; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(v); v = new OurView(this); } @Override protected void onPause() { super.onPause(); v.pause(); } @Override protected void onResume() { super.onResume(); v.resume(); } public class OurView extends SurfaceView implements Runnable { Thread t = null; SurfaceHolder holder; boolean isOk = false; public OurView(Context context){ super(context); holder = getHolder(); } public void run(){ if(isOk){ } } public void pause(){ isOk = false; while (true){ try { t.join(); t = null; break; } catch (InterruptedException e) { e.printStackTrace(); } } } public void resume(){ isOk = true; t = new Thread(this); t.start(); } } } 没有规则。

当然,这个新的CFG可能不是LALR(1)因此不能直接被野牛使用 - 您可能需要重构它以使其成为LALR(1),或者使用GLR解析器适当的合并规则。