add
,multiply
和assign
值和表达式命名为(a.k.a.创建变量和函数)。
首先看看BNF的Hava:
<Program> ::= <Line>(<NewLine><Line>)*
<Line> ::= {"("}<Expression>{")"}|<Assignment>
<Assignment> ::= <Identifier>"="<Expression>
<Identifier> ::= <Name>{"("<Name>(","<Name>)*")"}
<Expression> ::= <Summand>(("+"|"-")<Summand>)*
<Summand> ::= <Factor>(("*"|"/")<Factor>)*
<Factor> ::= <Number>|<Call>
<Call> ::= <Name> {"("<Expression>(","<Expression>)*")"}
<Name> ::= <Letter>(<Letter>|<Digit>)*
<Number> ::= {"+"|"-"}(<Digit>|<DigitNoZero><Digit>+)
<Digit> ::= "0"|<DigitNoZero>
<DigitNoZero> ::= "1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<Letter> ::= [a-zA-Z]
<NewLine> ::= "\n"|"\r"|"\r\n"
如您所见,此BNF在NewLine
旁边没有空格。在解析开始之前,我计划从字符串中删除所有空格(当然在NewLine
旁边)以进行解析。无论如何,它对于解析器来说并不是必需的。
当使用现在定义的语言时,有4件事可能导致问题,我希望你能帮我找出合适的解决方案:
<Expression>
,<Summand>
,<Factor>
和<Call>
之间有一个圆圈。使用手和脑我可以成功解析以下测试用例:
"3"
"-3"
"3-3"
"a=3"
"a=3+b"
"a=3+b\nc=a+3"
"a(b,c)=b*c\ra(1+2,2*3)"
请帮助改进BNF,它可用于成功编写计算器。
修改 这个BNF真的没有完成。它不会将案例“2 + -3”(应该失败,但不会)和“2 +( - 3)”(不应该失败,但确实如此)正确处理。
答案 0 :(得分:2)
gramar以完全相同的方式处理变量和函数。大多数编程语言都有所不同。在这里区分是否有必要?
能够将函数调用的结果与局部变量或常量表达式完全相同,这正是定义(数学)函数的关键所在。第一名。我无法想象使用允许函数但不处理的语法
1 + 1
与
完全相同1 + a
或
1 + sin(x)