语法帮助(自动机理论)?

时间:2011-11-11 21:38:34

标签: automaton

大家好我有一个问题,关于Automaton的简单问题,我不确定这是否适合这个问题。 实际上今年我有一个编译器构建课程,如果有人知道一些好资源,最好在这里发帖。

起初我有一个非常基本的问题:对于ex我有一个表达式:2 + 3 * 5,如何为这个表达式编写语法?我的意思是一个含糊不清的例子 感谢

1 个答案:

答案 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有几百个。通过巧妙地安排它们,你可以强迫某些事物先于其他事物匹配。