我需要绘制一个可以识别算术表达式的DFA图,不允许变量或括号。它只能包含数字和四个算术运算符。
它必须接受带或不带符号的任何数字字符串 - 例如5,-7,+ 15。 并且数字串可以与算术运算符混合 - 例如3 + 5,-1 + 7 * 3.
我不知道我的图表是否真的满足了这个要求。
答案 0 :(得分:0)
不,你的图表还不够好:它允许+/-/+++
作为表达式。
我首先使用类似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。可能它有ε过渡,还是你需要所有边缘的输入?它必须是确定性的吗?根据这些答案,您可能会有更多或更少的工作。
你不必机械地将正则表达式转为自动机;有了一点人性的直觉,你可以建立一个更简单的自动机。但请确保您在自动机中反映出在构建这些表达式时捕获的所有注意事项。避免允许超过一个小数点。避免链接运营商。确保每个数字至少有一位数。这样的事情。