大家好我有一个问题,关于Automaton的简单问题,我不确定这是否适合这个问题。 实际上今年我有一个编译器构建课程,如果有人知道一些好资源,最好在这里发帖。
起初我有一个非常基本的问题:对于ex我有一个表达式:2 + 3 * 5,如何为这个表达式编写语法?我的意思是一个含糊不清的例子 感谢
答案 0 :(得分:1)
你不能“为[一个]表达式写一个语法”。语法是生产的规则。一个简单的例子是:
S -> (S)
S -> SS
S -> [empty]
你能看到这个语法的作用吗?
基本上,这允许您生成字符串,如“”,“()”,“((()())())”。注意我说“生成” - 从逻辑上讲,你从单个“S”开始,然后从那里开始工作,用右边的一些“生产”替换每个S.但关键是,通过这种方法生成的任何字符串在语法上都是“语法正确的”。
解析与此相反 - 将字符串转换为相应的制作顺序。如果可以通过多种方式完成,语法就会模糊不清。
当你编写编译器时,首先需要“lex”输入。应将2 + 3 * 5缩小为NUM ADD NUM TIMES NUM(每个都是一个标记)。然后基于语法解析标记以构建“语法树”,可能类似于:
_ + _
2 *
3/ \5
您需要编写生产规则,以便有效的字符串是唯一可以生成的内容。这有点棘手,有点艺术,所以如果没有更多的细节我就无能为力。
优先级由不同的非终结符号(例如S和T)处理。一个真正的解析器将有几十个。 C有几百个。通过巧妙地安排它们,你可以强迫某些事物先于其他事物匹配。