Math 用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

我已经写了下面的BNF“代码”,它试图用BNF描述简单的数学。我遇到的问题是,我不知道如何添加括号(方括号)

数字::=“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";