Math 用BNF表示简单数学
我已经写了下面的BNF“代码”,它试图用BNF描述简单的数学。我遇到的问题是,我不知道如何添加括号(方括号)Math 用BNF表示简单数学,math,bnf,Math,Bnf,我已经写了下面的BNF“代码”,它试图用BNF描述简单的数学。我遇到的问题是,我不知道如何添加括号(方括号) 数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”; 数字::=|; 编号::=|。; 加法::=+; 减法::=-; 乘法::=*; 分部::=/; 值::=| | | |; 另一个问题是,我不确定BNF是否100%正确,因为值“description”在我看来不正确。数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8
数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
数字::=|;
编号::=|。;
加法::=+;
减法::=-;
乘法::=*;
分部::=/;
值::=| | | |;
另一个问题是,我不确定BNF是否100%正确,因为值“description”在我看来不正确。数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
Digit ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";
Digits ::= <Digit>|<Digit><Digits>;
Number ::= <Digits>|<Digits>.<Digits>;
Operator ::= "+" | "-" | "*" | "/"
Bracket_Left ::= "("
Bracket_Right ::= ")"
Value ::= <Number>|<Bracket_Left><Value><Bracket_Right>|<Value><Operator><Value>
数字::=|;
编号::=|。;
运算符::=“+”|“-“|”*“|”/”
左括号::=“(”
右括号::=“””
值::=||
也许不是最优雅的解决方案,但应该有效。始终记住递归的威力。数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
数字::=|;
编号::=|。;
运算符::=“+”|“-“|”*“|”/”
左括号::=“(”
右括号::=“””
值::=||
也许不是最优雅的解决方案,但应该有效。始终记住递归的威力。数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
数字::=|;
编号::=|。;
运算符::=“+”|“-“|”*“|”/”
左括号::=“(”
右括号::=“””
值::=||
也许不是最优雅的解决方案,但应该有效。始终记住递归的威力。数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
数字::=|;
编号::=|。;
运算符::=“+”|“-“|”*“|”/”
左括号::=“(”
右括号::=“””
值::=||
也许不是最优雅的解决方案,但应该有效。始终牢记递归的威力。如果您也追求运算符优先级,则应通过递归使用众所周知的方法(在我的示例中为正确的方法):
AddSub::=(“+”|“-”)|;
MulDiv::=(“*”|“/”)|;
方括号::=“(”“)”|;
小数点::=“|”;
整数::=|;
数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
解析器自动跟随运算符优先级,无需进一步干预。这个方法不是我发明的,它已经存在了几十年了,但我不得不承认它有点和蔼可亲。如果你也追求运算符优先级,你应该通过递归使用众所周知的方法(在我的示例中是正确的):
AddSub::=(“+”|“-”)|;
MulDiv::=(“*”|“/”)|;
方括号::=“(”“)”|;
小数点::=“|”;
整数::=|;
数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
解析器自动跟随运算符优先级,无需进一步干预。这个方法不是我发明的,它已经存在了几十年了,但我不得不承认它有点和蔼可亲。如果你也追求运算符优先级,你应该通过递归使用众所周知的方法(在我的示例中是正确的):
AddSub::=(“+”|“-”)|;
MulDiv::=(“*”|“/”)|;
方括号::=“(”“)”|;
小数点::=“|”;
整数::=|;
数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
解析器自动跟随运算符优先级,无需进一步干预。这个方法不是我发明的,它已经存在了几十年了,但我不得不承认它有点和蔼可亲。如果你也追求运算符优先级,你应该通过递归使用众所周知的方法(在我的示例中是正确的):
AddSub::=(“+”|“-”)|;
MulDiv::=(“*”|“/”)|;
方括号::=“(”“)”|;
小数点::=“|”;
整数::=|;
数字::=“0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”;
解析器自动跟随运算符优先级,无需进一步干预。这个方法不是我发明的,它已经存在了几十年了,但我不得不承认它有点和蔼可亲。哇,这比我的简单多了!谢谢你有没有理由使用左括号和右括号而不是直接插入到值定义中?事实上没有,这是不必要的-我只是想把基本定义和派生定义分开:)OCD lolIt真的很有意义,我想我会保持这种方式。谢谢哇,这比我的简单多了!谢谢你有没有理由使用左括号和右括号而不是直接插入到值定义中?事实上没有,这是不必要的-我只是想把基本定义和派生定义分开:)OCD lolIt真的很有意义,我想我会保持这种方式。谢谢哇,这比我的简单多了!谢谢你有没有理由使用左括号和右括号而不是直接插入到值定义中?事实上没有,这是不必要的-我只是想把基本定义和派生定义分开:)OCD lolIt真的很有意义,我想我会保持这种方式。谢谢哇,这比我的简单多了!谢谢你有没有理由使用左括号和右括号而不是直接插入到值定义中?事实上没有,这是不必要的-我只是想把基本定义和派生定义分开:)OCD lolIt真的很有意义,我想我会保持这种方式。谢谢
Digit ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";
Digits ::= <Digit>|<Digit><Digits>;
Number ::= <Digits>|<Digits>.<Digits>;
Operator ::= "+" | "-" | "*" | "/"
Bracket_Left ::= "("
Bracket_Right ::= ")"
Value ::= <Number>|<Bracket_Left><Value><Bracket_Right>|<Value><Operator><Value>
AddSub ::= <MulDiv> ("+" | "-") <AddSub> | <MulDiv>;
MulDiv ::= <Brackets> ("*" | "/") <MulDiv> | <Brackets>;
Brackets ::= "(" <AddSub> ")" | <Decimal>;
Decimal ::= <Integer> "." <Integer> | <Integer>;
Integer ::= <Digit> <Integer> | <Digit>;
Digit ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9";