首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >终端和非终端符号

终端和非终端符号
EN

Stack Overflow用户
提问于 2018-06-11 15:42:16
回答 1查看 2.7K关注 0票数 2

我目前正在阅读有关解释器模式的文章,其中包含了一些关于终端和非终端符号的内容。所以我去维基百科读了这篇文章。但我还是不明白终端和非终端符号是什么。你能给我举几个编程例子吗?我不想让维基百科的网页被复制.我想要真实世界的例子。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 17:00:26

每一种语言--无论是人类语言、计算机语言还是科学符号--都是由符号组成的。这些符号是语言中最小的有意义的单位,例如人类语言有单词和标点符号;数学有数字和运算符;Java有标识符、文字和符号。这些基本符号是终端,这是您可以将语句分解到的最小部分。

这些终端被串在一起进行陈述,语言有特定的方式将非终端串在一起来表达意义,例如在数学中,您可以将一个数字、一个操作数和另一个数字(例如5 + 2)连接起来进行操作,而在Java中,您可以将一个标识符、一个等号符号、一个数字文字和一个分号符号(例如size = 50 ;)连接起来进行赋值语句。这些允许的合并终端的方式称为non-terminals.。非终端可以是终端、其他非终端的组合,或者两者兼而有之.

因此,基本上,终端是一种语言的符号,而非终端是这些终端的组合,用于表达和陈述。例如,简单的编程语言可能有诸如ifelsewhile+-()++--'\n'3.14159等多种终端。这些终端可以合并成非终端,例如:

  • 赋值语句
  • If语句
  • 同时循环
  • 变量声明
  • 诸若此类

解释器模式是将这些终端符号和非终端符号定义为与语言结构相匹配的类或数据类型。因此,对于数字或标识符这样的终端符号,可以定义如下

代码语言:javascript
复制
abstract class Symbol {
    abstract int evaluate();
}

class Number extends Symbol {
    int value;

    @Override int evaluate() {
        return value;
    }
}

class Identifier extends Symbol {
    String name;

    @Override int evaluate() {
        return getIdentifierValue(name);
    }
}

然后,非终端符号(如if语句或表达式)可以定义为

代码语言:javascript
复制
class IfStatement extends Symbol {
    Symbol condition;
    Symbol ifBranch;
    Symbol elseBranch;

    @Override int evaluate() {
        if (condition.evaluate() != 0)
            return ifBranch.evaluate();
        else
            return elseBranch.evaluate();
    }
}

class AddExpression extends Symbol {
    Symbol left;
    Symbol right;

    @Override int evaluate() {
        return left.evaluate() + right.evaluate();
    }
}

所以你可以看到,终端表示数字、标识符和字符串之类的值,而非终端代表从这些终端递归生成的表达式和语句。我不太擅长解释理论,但我希望这里的实际例子能帮助你理解。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50801512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档