Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为一种小型语言构建一个解释器?_Java_C++_Interpreter - Fatal编程技术网

Java 如何为一种小型语言构建一个解释器?

Java 如何为一种小型语言构建一个解释器?,java,c++,interpreter,Java,C++,Interpreter,我在想从哪里开始这个项目。也许有人能把我引向正确的方向 我有一门小语言,我必须为它写一个翻译。该语言由括号中的表达式组成: (integer integer operator) 或由下列表达式组成的算术IF语句: IF exp1 exp2 exp3 exp4 其中,如果exp1为负,则返回exp2, 如果exp1为零,则返回exp3, 如果exp1为正,则返回exp4 运算符为+或x(分别用于加法和乘法) 我必须一起实现一个扫描器/解析器,然后是输出结果的解释器。解释器部分不会很难,但我不知

我在想从哪里开始这个项目。也许有人能把我引向正确的方向

我有一门小语言,我必须为它写一个翻译。该语言由括号中的表达式组成:

(integer integer operator)
或由下列表达式组成的算术IF语句:

IF exp1 exp2 exp3 exp4
其中,如果exp1为负,则返回exp2, 如果exp1为零,则返回exp3, 如果exp1为正,则返回exp4

运算符为+或x(分别用于加法和乘法)

我必须一起实现一个扫描器/解析器,然后是输出结果的解释器。解释器部分不会很难,但我不知道如何启动扫描/解析过程

我从使用Java开始,让一个Scanner对象收集输入并将其存储在字符串中。然后,我将字符串拆分为一个字符串数组,不使用任何内容作为分隔符(这样,每个字符、符号、空格等都存储在它自己的字符串索引中)。这可能不是最好的方法,因为我不知道从这里走到哪里。我无法理解的部分是,如果不遵循此语法,如何返回错误,或者如何检测括号和/或if and等

下面是我在最后一段中描述的代码片段:

public void run() {
    Scanner sc = new Scanner(System.in);

    while (sc.hasNext()) {
        String sLine = sc.nextLine();
        String[] scanned = sLine.split("");
输入示例:

(7 2 +)

Output: 9

IF (2 -2 +) (5 2 +) (5 -2 x) (5 2 x)

Output: -10

如果有人给我一个好的方向,请分享。:)

如果你喜欢java,使用javacc很容易。您可以以一种简洁而简单的方式提及您的令牌以及如何使用它们,然后在编译时,它会在java源代码中生成执行逻辑所需的所有代码


< P>我建议你使用C++和Boost精神库…< /P> < P>你可以使用基于堆栈的算法来处理后缀表达式。
一个简单的想法是将整数推到堆栈上,当您遇到运算符时,从堆栈中弹出整数并执行运算符所述的操作,如+、-。

我认为使用ANTLR、JavaCC、SampleCC或其他解析器生成器工具将是使用大锤敲开螺母。若语法定义中并没有递归,那个么只有几个方法就足够了。下面的代码给出了一个基本想法(它可能无法编译或工作,我从头开始编写它作为如何开始的说明):

public int解析(字符串输入){
扫描仪=新扫描仪(输入);
返回线(扫描仪);
}
公共int用户线(扫描仪){
if(scanner.hasNext(“”){
返回表达式(扫描器);
}else if(scanner.hasNext(“if”)){
返回(扫描仪);
}
}
公共int表达式(扫描程序){
扫描器。下一个(“”);
int a=scanner.nextInt();
int b=scanner.nextInt();
String op=scanner.next(“[+-/*]”);
扫描器。下一个(“)”;
如果(“+”。等于(op)){
返回a+b;
}如果(“-”。等于(op)){
返回a-b;
} ...
抛出新的RuntimeException(“解析错误”);
}
公共int consumeIf(扫描仪){
扫描器。下一步(“如果”);
int exp1=用户表达式(扫描仪);
int exp2=用户表达式(扫描仪);
int exp3=用户表达式(扫描仪);
int exp4=表达式(扫描仪);
如果(exp1<0){
返回exp2;
}else if(exp1==0){
返回exp3;
} ...
抛出新的RuntimeException(“不应该在这里(TM)”;
}

如果您使用的是Java,那么我建议在对基础知识进行分类后,您可以研究如何实现。我建议从一本关于编译器的书开始(前几个步骤在“解释器”和“编译器”之间几乎相同)。而“龙”书是高度推荐的,也有许多温和的资源。考虑也寻找底层的课程材料。懒惰,我更喜欢递归下降Parsers。谢谢你至少给我一些解释器的建议。我相信我自己已经弄清楚了扫描器/解析器部分。@ PragneshChauhan:IT地址“如何为一门小语言构建一个口译员”和“如果有人对我有好的指导,请与我分享。”“-这让理性主义者去阅读,去理解为什么这会对他或她有所帮助。半小时的精神文献阅读将准确地解释图书馆如何处理问题中提到的具体问题。我将此作为一个“答案”与其说是评论,不如说是同意spirit是一个特别有前途的方向的人可以表示同意其他建议。谢谢你。我对你的代码做了一些修改,看起来它应该可以工作,但每次我尝试使用hasNext()或next()用括号作为参数,我得到了一个正则表达式语法错误。有没有关于如何测试一个“(”正确?@Rationalist啊,我确实忘记了scanner.next()接受一个正则表达式而不是简单的字符串。只需使用“(”和“)”
public int parse(String input) {
Scanner scanner = new Scanner(input);

    return consumeLine(scanner);
}

public int consumeLine(Scanner scanner) {
    if( scanner.hasNext("(") ) {
        return consumeExpression(scanner);

    } else if( scanner.hasNext("IF") ) {
        return consumeIf(scanner);
    }
}


public int consumeExpression(Scanner scanner) {
    scanner.next("(");
    int a = scanner.nextInt();
    int b = scanner.nextInt();
    String op = scanner.next("[+-/*]");
    scanner.next(")");

    if( "+".equals(op) ) {
        return a + b;

    } else if( "-".equals(op) ) {
        return a - b;
    } ...

    throw new RuntimeException("parsing error");
}

public int consumeIf(Scanner scanner) {
    scanner.next("IF");
    int exp1 = consumeExpression(scanner);
    int exp2 = consumeExpression(scanner);
    int exp3 = consumeExpression(scanner);
    int exp4 = consumeExpression(scanner);

    if( exp1 < 0 ) {
        return exp2;
    } else if( exp1 == 0 ) {
        return exp3;
    } ...

    throw new RuntimeException("should not be here (TM)");
}