标题很可能与我的意思不明确,但我有这个问题要做:
考虑包含变量x,y,z和二元运算符+,*的算术表达式的语法.
<expr> -> <term> { + <term> }
<term> -> <factor> { * <factor> }
<factor> -> <var> | ( <expr> )
<var> -> x | y| z
Run Code Online (Sandbox Code Playgroud)
在Scheme中编写一个名为executer的函数,它接受一个可从上述语法派生的表达式字符串并输出表达式的值,假设x,y和z分别为2,4和8.例如电话
(executer "((x * x) + y * (z) + y)")
Run Code Online (Sandbox Code Playgroud)
应该产生40.您的实施必须确定非法表达并遵守"*"优先于"+".
现在我一直在努力做到这一点,但我不知道如何在计划上解决这个问题.我试图自己解决这个问题,但我选择向你们寻求帮助.
您认为可能有用的文档或其他类似代码的任何链接都会很棒.
提前感谢我为此提供的任何帮助.
提示:此问题有两个部分:
创建一个解析器,该解析器获取列表,解析令牌,将语法树构建为列表.
创建求值程序,它将解析后的AST并将(表达式)解析为结果.
首先define-type定义你的语法.
你应该试着弄清楚如何2+3变成(add (2 3)),然后把它变成5.
编辑:
找到一份旧作业......这是前几行.挑出不相关的东西;)
(define-type AE
[num (n number?)]
[mylist (lhs AE?) (rhs list?)]
[myhead (n list?)]
[mytail (n list?)]
[add (lhs AE?) (rhs AE?)]
[mult (lhs AE?) (rhs AE?)]
[myconcat (lhs list?) (rhs list?)])
Run Code Online (Sandbox Code Playgroud)