gpt4 book ai didi

java - 编写简单语言的解析器

转载 作者:行者123 更新时间:2023-12-01 10:40:41 25 4
gpt4 key购买 nike

我正在尝试设计一种类似于嘴唇、模式的简单语言。我已经写了它的词法分析器(tokenizer)。我可以分为运算符、标识符等。但我现在尝试编写解析器。对于这一点,我只举一个例子就足够了。 有人能给我一个java代码的例子吗?此外,每个人都提到了antlr的用法。尝试使用antlr的人可以在这个问题中使用我的示例展示一个示例吗?

  • EXP -> EXPI | EXPB
  • EXPI -> (+ EXPI EXPI) | (- EXPI EXPI) | (* EXPI EXPI) | (/EXPI EXPI) |身份证 |整数值 | (Id EXPLIST)
  • EXPB ->(和 EXPB EXPB)

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

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

这是关于LR(shift-reduce parsing)的。我有一个简单的例子,我不知道是否可以修改代码进行解析。但是,有一点引起了我的注意,堆栈的使用对于 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();
}
}

最佳答案

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

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

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

关于java - 编写简单语言的解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34432136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com