标题很可能与我的意思含糊不清,但我有这个问题要做:
考虑包含变量x,y,z的算术表达式的语法, 和二元运算符+,*如下所示。
<expr> -> <term> { + <term> }
<term> -> <factor> { * <factor> }
<factor> -> <var> | ( <expr> )
<var> -> x | y| z
在Scheme中编写一个名为executer的函数,它接受一个表达式字符串 从上面的语法中导出并输出表达式的值, 假设x,y和z分别为2,4和8。例如,电话
(executer "((x * x) + y * (z) + y)")
应该生成40.您的实施必须确定非法表达并遵守 优先级为“*”而不是“+”。
现在我一直试图这样做,但我不知道如何解决这个问题。我试图自己解决这个问题,但我选择向你们寻求帮助。
您认为可能有用的文档或其他类似代码的任何链接都会很棒。
提前感谢我为此提供的任何帮助。
答案 0 :(得分:5)
提示:此问题分为两部分:
创建一个解析器,该解析器获取列表,解析令牌,将语法树构建为列表。
创建求值程序,它将解析后的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?)])