编写简单语言的解析器

时间:2015-12-23 09:13:19

标签: java antlr language-design

我试图设计一种简单的语言类似于嘴唇,架构。我写了它的词法分析器(tokenizer)。我可以分成运算符,标识符等。但我现在尝试编写解析器。为此,只有一个例子对我来说已经足够了。 有人能举例说明java代码中的一个例子吗?此外,每个人都提到使用antlr。尝试使用antlr的人是否可以在此问题中使用我的示例显示示例?

  • - EXP -> EXPI | EXPB
  • - EXPI -> (+ EXPI EXPI) | (- EXPI EXPI) | (* EXPI EXPI) | (/ EXPI EXPI) | Id | IntegerValue | (Id EXPLIST)
  • - EXPB -> (and EXPB EXPB)

如果我的输入是(+ 1 2),我希望得到输出

 - START-> INPUT
 - -> EXP
 - -> EXPI
 - -> (+ EXPI EXPI)
 - -> (+ EXPI Id)
 - -> (+ Id Id)

关于LR(shift-reduce解析)。我有一个简单的例子,我不知道是否可以修改代码进行解析。但是,有一点引起我的注意,堆栈的使用对于LR算法来说是正确的。不是吗?

import java.util.Stack;

public class SmallLisp {

    Stack<String> stack;

    public SmallLisp(){
        String[] tokens = new String[]{"(","+","2","(","+","3","2",")",")",};
        stack = new Stack<String>();
        for (int i=0;i<tokens.length;i++){
            stack.push(tokens[i]);
            if(tokens[i].equals(")")) Interprete();
        }
    }

    public void Interprete(){
        String tok;
        Stack<String> callStack = new Stack<String>();
        tok = stack.pop(); /* This is the ) character */
        while(!(tok=stack.pop()).equals("(")){
            callStack.push(tok);
        }
        Call(callStack);
    }

    public void Call(Stack<String> callStack){
        String func = callStack.pop(); /* This is the operator or function */
        if(func.equals("+")) {
            double result = Plus(callStack);
            stack.push(String.valueOf(result));
        }
        //if(func.equals("-")) Minus(callStack);
    }

    public double Plus(Stack<String> callStack){
        double a = Double.parseDouble(callStack.pop());
        double b = Double.parseDouble(callStack.pop());
        System.out.println("Answer is "+(a+b));
        return(a+b);
    }

    public static void main(String[] args) {
        new SmallLisp();
    }
}

1 个答案:

答案 0 :(得分:1)

如果您想避免编写自己的Parser,可以使用ANTLR

这是一个解析器生成器,如果您使用有效的语法支持它,它将为您完成所有工作。

如果您仍想自己编写,您仍然可以使用ANTLR来查看它们如何创建解析器/词法分析器。