如何在 EBNF 中使用语句实现"return"号?



这是我当前的语法:

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-stmtsub-stmtmul-stmtdiv-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

最新更新