Design patterns 终端和非终端符号

Design patterns 终端和非终端符号,design-patterns,interpreter-pattern,Design Patterns,Interpreter Pattern,我目前正在阅读有关解释器模式的文章,其中提到了一些关于终端和非终端符号的内容。所以我去了维基百科,读到了它。但我还是不明白什么是终端和非终端符号。你能给我一些编程的例子吗。我不想粘贴维基百科页面副本。。。我想要真实世界的例子。每种语言——无论是人类语言、计算机语言还是科学符号——都是由符号组成的。这些符号是语言中最小的有意义的单位,例如,人类语言有单词和标点符号;数学有数字和运算符;Java有标识符、文字和符号。这些基本符号是终端,是您可以将语句分解成的最小部分 这些终端串在一起构成语句,语言有

我目前正在阅读有关解释器模式的文章,其中提到了一些关于终端和非终端符号的内容。所以我去了维基百科,读到了它。但我还是不明白什么是终端和非终端符号。你能给我一些编程的例子吗。我不想粘贴维基百科页面副本。。。我想要真实世界的例子。

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

这些终端串在一起构成语句,语言有特定的方式可以将非终端串在一起来传达含义,例如,在数学中,可以将一个数字、一个操作数和另一个数字(例如
5
+
2
)连接起来进行操作,在Java中,可以将一个标识符连接起来,一个等号符号、一个数字文字和一个分号符号(例如,
大小
=
<50
)来生成赋值语句。这些允许的端子组合方式称为非端子。非端子可以是端子、其他非端子或两者的组合

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

  • 赋值语句
  • If语句
  • While循环
  • 变量声明
  • 等等
解释器模式的含义是,它接受那些终端和非终端符号,并将它们定义为与语言结构匹配的类或数据类型。因此,对于数字或标识符等终端符号,它们的定义如下

抽象类符号{
抽象int evaluate();
}
类编号扩展符号{
int值;
@重写int evaluate(){
返回值;
}
}
类标识符扩展了符号{
字符串名;
@重写int evaluate(){
返回getIdentifierValue(名称);
}
}
然后非终端符号,比如if语句或表达式,可以定义为

class语句扩展符号{
符号条件;
符号分支;
符号elseBranch;
@重写int evaluate(){
如果(条件.求值()!=0)
返回ifBranch.evaluate();
其他的
返回elseBranch.evaluate();
}
}
类AddExpression扩展了符号{
符号左;
符号权;
@重写int evaluate(){
返回left.evaluate()+right.evaluate();
}
}

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

所以终端是构建块,而非终端是构建的构造?(可以递归地用作其他构造的构建块?)这差不多就是了。