grammar - 如何在 EBNF 中使用语句实现“返回”数字?
问题描述
这是我目前的语法:
program -> stmt-sequence
stmt-sequence -> statement { TT_NEWLINE statement }
assign-stmt -> var identifier TT_EQ factor
print-stmt -> print factor
add-stmt -> add factor TT_COMMA factor
sub-stmt -> sub factor TT_COMMA factor
mul-stmt -> mul factor TT_COMMA factor
div-stmt -> div factor TT_COMMA factor
factor -> number | identifier
对于我的数学语句(add-stmt
, sub-stmt
, mul-stmt
, div-stmt
),我希望这些语句返回一个数字,就像它们是函数一样。
如果你不明白我所说的“返回”是什么意思,那么这里有一个例子:
print add 2, 4
我希望将数学语句“替换”为数字,即添加语句的结果。
print 6
^ 基本上,变成这样。
factor -> number | identifier | add-stmt | sub-stmt | mul-stmt | div-stmt
我不知道在因子中添加数学语句的交替是否合适。
我怎样才能基本上允许这些数学语句在 EBNF 语法中“返回”?
解决方案
数学语句不应包含终端,定义终端/语句return
不是它们的一部分。return
相反,您定义了一个新符号,例如
return-stmt -> TT_RETURN expr
之后,你定义什么expr
是。它会产生一个值:
expr -> factor | add-stmt | sub-stmt | mul-stmt | div-stmt
return-stmt
在定义和使用现有语句/表达式时要小心。您不应该生成如下文本/代码:
return return 4 + return 2 * 3
推荐阅读
- xml-parsing - 谁能帮我从 .XML 中获得价值
- windows - 队列中的老化值:Windows 计时器的最佳使用?
- python - (python) 如何将字典值转换为 pandas DataFrame
- python - 为什么 TensorBoard localhost:6006 只显示白页?
- firebase - 分页数据表和 Firebase
- python - 如何使用一些附加条件对我的数据帧执行 vlookup 等效操作
- javascript - setTimeout vs WebWorker vs XMLHttpRequest
- php - 如何在不调用递归循环函数的情况下将值传递给变量并返回它?
- .net-core - 找不到证书 - Azure .NET Core 应用程序
- c++ - 强制 GCC 将特定语句放在特定部分