【问题标题】:DFA diagram to recognize arithmetic expressionsDFA图识别算术表达式
【发布时间】:2018-07-23 07:05:04
【问题描述】:

我需要绘制一个可以识别算术表达式的 DFA 图,不允许使用变量或括号。它只能包含数字和四个算术运算符。

它必须接受任何带或不带符号的数字字符串 - 例如5,-7,+15。 并且数字字符串可以与算术运算符混合 - 例如3+5 , -1+7*3。

我不知道我的图表是否真的满足了这个要求。

【问题讨论】:

  • 欢迎来到 Stack Overflow。这不是家庭作业完成服务。您的老师给了您作业,而不是我们,您将需要自己做作业。如果我们为你做,你什么也学不到。如果您无法开始,请向您的老师寻求帮助;他们得到报酬来教你。祝你好运。
  • 我投票决定将此问题作为题外话结束,因为它与实际编程无关,而是属于Computer Science Stack Exchange

标签: math operators diagram dfa


【解决方案1】:

不,您的图表还不够好:它允许 +/-/+++ 作为表达式。

我会首先使用EBNF 之类的东西来制定它,然后将其转换为regular expression(本质上是内联非终端),然后再将build 转换为DFA。

什么是数字?只有整数,还是可以有小数点?如果小数点没问题,你需要前后数字,还是只需要其中一个?您是否允许使用带有“e”的科学记数法?数字中是否可能有前导零,或者仅当整个整数部分为零时?那么标志呢?你允许多于一个吗?您是否允许在任何算术运算符后使用一元加号或减号?

根据您上面的回答,EBNF 可能看起来像这样:

digits     = digit { digit }
number     = [ "+" | "-" ] ( digits [ "." [ digits ] ] | "." digits )
operator   = "+" | "-" | "*" | "/"
expression = number { operator number }

把这些东西变成正则表达式:

digits    : [0-9]+
number    : [+\-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)
operator  : [+\-*/]
expression: [+\-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([+\-*/][+\-]?([0-9]+(\.[0-9]*)?|\.[0-9]+))*

现在,您可以使用最终的正则表达式来构建 DFA。它可能有 ε 转换,还是你需要在所有边上输入?它必须是确定性的吗?根据这些答案,您可能会有或多或少的工作。

您不必机械地将正则表达式转换为自动机;借助一点人类直觉,您可以构建一个更简单的自动机。但是请确保您看到在构建这些表达式时所捕获的所有考虑因素都反映在您的自动机中。避免允许多于一位小数。避免链接运算符。确保每个数字至少有一个数字。诸如此类。

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2015-07-02
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多