我尝试为Haskell语言编写一个解析器,另外需要注意的是,解析的程序可以是任何有效Haskell源代码的任何前缀。
例如,在我的情况下,这是有效的来源:
func x = (x +
这里有一个类似BNF的Haskell规范:https://www.haskell.org/onlinereport/syntax-iso.html#sect9.5。
是否有将BNF语法转换为接受此类前缀语言的bison语法的示意方法?
本练习的上下文是Emacs编辑器,源代码是正在编写的程序,目标是在程序员编写源代码时提供缩进提示。
答案 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解析器适当的合并规则。