【问题标题】:How to implement a "return" number with statements in EBNF?如何在 EBNF 中使用语句实现“返回”数字?
【发布时间】:2020-11-15 06:14:39
【问题描述】:

这是我目前的语法:

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 语法中“返回”?

【问题讨论】:

    标签: grammar ebnf


    【解决方案1】:

    数学语句不应包含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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多