大家好,我有一个问题,Automaton 的简单问题,我不确定这是否是提出此类问题的正确位置。实际上,今年我有一门课程编译器构造,如果有人知道一些好的资源,最好在这里发帖。
起初我有一个非常基本的问题:对于 ex 我有一个表达式,如: 2+3*5 ,如何为这个表达式编写语法?我的意思是一个模棱两可和一个非模棱两可的例子谢谢
大家好,我有一个问题,Automaton 的简单问题,我不确定这是否是提出此类问题的正确位置。实际上,今年我有一门课程编译器构造,如果有人知道一些好的资源,最好在这里发帖。
起初我有一个非常基本的问题:对于 ex 我有一个表达式,如: 2+3*5 ,如何为这个表达式编写语法?我的意思是一个模棱两可和一个非模棱两可的例子谢谢
您不能“为 [an] 表达式编写语法”。语法是生产规则。一个简单的例子是:
S -> (S)
S -> SS
S -> [empty]
你能看出这个语法是做什么的吗?
本质上,这允许您生成像“”、“()”、“((()())())”这样的字符串。注意我说的是“生成”——从逻辑上讲,你从一个“S”开始,然后从那里开始工作,用右边的一些“生产”替换每个 S。但关键是,您通过这种方法生成的任何字符串在形式上都是“语法正确的”。
解析与此相反 - 将字符串转换为相应的产生顺序。如果可以以多种方式完成,则语法是模棱两可的。
在编写编译器时,首先需要“lex”输入。2+3*5 应该被转换成类似 NUM ADD NUM TIMES NUM 的东西(每个都是一个令牌)。然后根据语法解析标记以构建“语法树”,可能类似于:
_ + _
2 *
3/ \5
您需要编写生产规则,以便有效字符串是唯一可以生成的东西。这有点棘手,而且有点艺术,所以如果没有更多细节,我无能为力。
使用不同的非终结符(例如 S 和 T)处理优先级。一个真正的解析器会有几十个。C有数百个。通过巧妙地安排它们,你可以迫使某些事物先于其他事物匹配。