Math 用于识别算术表达式的DFA图

Math 用于识别算术表达式的DFA图,math,operators,diagram,dfa,Math,Operators,Diagram,Dfa,我需要画一个DFA图,可以识别算术表达式,变量或括号是不允许的。它只能包含数字和四个算术运算符 它必须接受任何带或不带符号的数字字符串,例如5、-7、+15。 数字字符串可以与算术运算符混合,例如3+5,-1+7*3 我不知道我的图表是否真的满足了这些要求 不,您的图表还不够好:它允许+/-/++作为表达式 我将首先使用类似的方法来描述这个,然后将其转换为一个(基本上是内联非终端),然后再从中转换为一个DFA 什么是数字?只有整数,或者可以有小数点?如果小数点没问题,您是需要前后的数字,还是只需

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

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

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


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

我将首先使用类似的方法来描述这个,然后将其转换为一个(基本上是内联非终端),然后再从中转换为一个DFA

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

根据以上答案,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]+))*
现在,您可以使用最终的regexp来构建DFA。它可能有ε变换,还是所有边都需要输入?它必须是确定性的吗?根据这些答案,你可能会有更多或更少的工作要做


你不必机械地把regexp变成一个自动机;通过一点人类的直觉,你可以构建一个更简单的自动机。但是,请确保您看到了在构建这些表达式时捕获的所有注意事项都反映在您的自动机中。避免允许超过一个小数点。避免链接操作员。确保每个数字至少有一位数字。诸如此类。

欢迎使用堆栈溢出。这不是家庭作业完成服务。。你的导师给了你作业,而不是我们,你需要做你自己的工作。如果我们为你做,你什么也学不到。如果你不能开始,向你的老师寻求帮助;他们被雇来教你。祝你好运。我投票结束这个问题,因为它不是关于实用编程,而是属于主题。