首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数学表达式BNF的改进

数学表达式BNF的改进
EN

Stack Overflow用户
提问于 2010-09-28 09:21:53
回答 1查看 3K关注 0票数 2

在学习编程时,一个很好的练习,就是写一个计算器。为此,我在BNF中创建了某种类型的BNF,并希望得到您的帮助以改进它。使用这种小型语言,您应该能够使用addmultiplyassign值以及名称表达式(a.k.a )。创建变量和函数)。

首先看看BNF:

代码语言:javascript
运行
复制
<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之外)。无论如何,这对解析器来说并不是必要的。

有四件事情可能会导致问题在使用当前定义的这种语言时,我希望您能帮助我找到适当的解决方案:

  1. 我试图遵循自顶向下的方法,同时生成这个语法,但是在<Expression><Summand><Factor><Call>之间有一个循环。
  2. 语法处理变量和函数的方式完全相同。大多数编程语言都起着重要作用。在这里有什么区别吗?
  3. 也许有些事情我不知道编程,BNF,无论如何,这会杀死我以后,同时试图实现BNF。但在我开始之前你可能会发现的。
  4. 可能有一些简单而愚蠢的错误,我找不到自己。那样的话很抱歉。我希望再也没有这些错误了。

使用手和大脑,我可以成功地解析以下测试用例:

代码语言:javascript
运行
复制
"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)”(不应该失败,但确实应该)的情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-28 11:00:57

语法处理变量和函数的方式完全相同。大多数编程语言都起着重要作用。在这里有什么区别吗?

首先,能够将函数调用的结果与局部变量或常量表达式完全相同,这正是定义(数学)函数的关键。我无法想象语法的使用,它允许函数,但没有处理

代码语言:javascript
运行
复制
1 + 1

完全一样

代码语言:javascript
运行
复制
1 + a

代码语言:javascript
运行
复制
1 + sin(x)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3811325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档