终端和非终端符号

时间:2018-06-11 15:42:17

标签: design-patterns interpreter-pattern

我目前正在阅读有关解释器模式的内容,并在其中说明有关终端和非终结符号的内容。所以我去了维基百科并阅读了它。但我仍然不明白终端和非终端符号是什么。你能给我一些编程的例子。我不希望维基百科页面被复制粘贴......我想要真实世界的例子。

1 个答案:

答案 0 :(得分:2)

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

将这些终端串在一起进行陈述,并且语言具有特定的方式,您可以将非终端串联在一起以传达意义,例如在数学中,你可以加入一个数字,一个操作数和另一个数字(例如5 + 2)来制作一个操作,在Java中你可以加入标识符,等号符号,数字文字和分号符号(例如size = 50 ;)以生成赋值语句< / em>的。这些允许的组合终端的方式称为 非终端 。非终端可以是终端,其他非终端或两者的组合。

所以基本上,终端是语言的符号,而非终端是这些终端的组合,用于表达和表达。例如,简单的编程语言可能包含ifelsewhile+-(,{{ 1}},)++--'\n'等等。这些终端可以组合成非终端,例如:

  • 作业声明
  • 如果声明
  • while loop
  • 变量声明
  • 等等

解释器模式是什么,它采用那些终端和非终端符号,并将它们定义为与语言结构匹配的类或数据类型。因此,对于数字或标识符等终端符号,可以将它们定义为

3.14159

然后像if语句或表达式这样的非终端符号可以定义为

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);
    }
}

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