终端符号和非终端符号
Terminal and non terminal symbols
我目前正在阅读有关解释器模式的内容,其中提到了一些关于终端符号和非终端符号的内容。所以我去了维基百科并阅读了它。但我仍然不明白什么是终端符号和非终端符号。你能给我一些编程的例子吗?我不想复制粘贴维基百科页面...我想要真实世界的例子。
每种语言——无论是人类语言、计算机语言还是科学记数法——都是由符号组成的。这些符号是语言中最小的有意义的单位,例如人类语言有单词和标点符号;数学有数字和运算符; Java 有标识符、文字和符号。这些基本符号是 终端 ,您可以将语句分成的最小部分。
这些终结符串在一起构成陈述,并且语言有特定的方式可以将非终结符串在一起以传达含义,例如在数学中,您可以加入一个数字、一个操作数和另一个数字(例如 5
+
2
)来进行 运算 ,并且在Java 你可以加入一个标识符、一个等号符号、一个数字文字和一个分号符号(例如 size
=
50
;
)来制作赋值语句。这些允许的终端组合方式称为 非终端。非终端可以是终端、其他非终端或两者的组合。
所以基本上,终结符是一种语言的符号,而非终结符是这些终结符的组合,可以构成表达式和语句。例如,一种简单的编程语言可能有像 if
、else
、while
、+
、-
、(
、)
、++
、--
、'\n'
、3.14159
等等。这些终端可以组合成非终端如:
- 赋值语句
- If 语句
- While 循环
- 变量声明
- 等等
什么是解释器模式,它采用那些终端符号和非终端符号并将它们定义为 类 或与语言结构匹配的数据类型。因此,对于数字或标识符等终端符号,可以将它们定义为
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 语句或表达式这样的非终结符号可以定义为
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();
}
}
所以你可以看到,终结符代表数字、标识符和字符串等值,而非终结符代表从这些终结符递归构建的表达式和语句。我不太擅长理论解释,但我希望这里的实际例子能帮助你理解。
我目前正在阅读有关解释器模式的内容,其中提到了一些关于终端符号和非终端符号的内容。所以我去了维基百科并阅读了它。但我仍然不明白什么是终端符号和非终端符号。你能给我一些编程的例子吗?我不想复制粘贴维基百科页面...我想要真实世界的例子。
每种语言——无论是人类语言、计算机语言还是科学记数法——都是由符号组成的。这些符号是语言中最小的有意义的单位,例如人类语言有单词和标点符号;数学有数字和运算符; Java 有标识符、文字和符号。这些基本符号是 终端 ,您可以将语句分成的最小部分。
这些终结符串在一起构成陈述,并且语言有特定的方式可以将非终结符串在一起以传达含义,例如在数学中,您可以加入一个数字、一个操作数和另一个数字(例如 5
+
2
)来进行 运算 ,并且在Java 你可以加入一个标识符、一个等号符号、一个数字文字和一个分号符号(例如 size
=
50
;
)来制作赋值语句。这些允许的终端组合方式称为 非终端。非终端可以是终端、其他非终端或两者的组合。
所以基本上,终结符是一种语言的符号,而非终结符是这些终结符的组合,可以构成表达式和语句。例如,一种简单的编程语言可能有像 if
、else
、while
、+
、-
、(
、)
、++
、--
、'\n'
、3.14159
等等。这些终端可以组合成非终端如:
- 赋值语句
- If 语句
- While 循环
- 变量声明
- 等等
什么是解释器模式,它采用那些终端符号和非终端符号并将它们定义为 类 或与语言结构匹配的数据类型。因此,对于数字或标识符等终端符号,可以将它们定义为
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 语句或表达式这样的非终结符号可以定义为
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();
}
}
所以你可以看到,终结符代表数字、标识符和字符串等值,而非终结符代表从这些终结符递归构建的表达式和语句。我不太擅长理论解释,但我希望这里的实际例子能帮助你理解。