Parsing 我的标准解析方法是什么?

Parsing 我的标准解析方法是什么?,parsing,compiler-construction,Parsing,Compiler Construction,我想写一个简单的编译器。 在语法中,每一行只包含一条语句 1) 首先扫描仪完成他的工作;因此,对于每一行,我们都有代币 2) 对于每一行,我们检查它的类型(如果是stm,对于stm,变量定义,结束,…)。 在这一步中,将诊断出这些类型的线。例如: func definition var def assignment for stm ... end end 3) 现在是检查线路顺序的时候了 换句话说,我们检查: 1) 每个单词(扫描器) 2) 每行单独(行语法) 3) 行块(编程语言语法) 我的

我想写一个简单的编译器。 在语法中,每一行只包含一条语句

1) 首先扫描仪完成他的工作;因此,对于每一行,我们都有代币

2) 对于每一行,我们检查它的类型(如果是stm,对于stm,变量定义,结束,…)。 在这一步中,将诊断出这些类型的线。例如:

func definition
var def
assignment
for stm
...
end
end
3) 现在是检查线路顺序的时候了

换句话说,我们检查:

1) 每个单词(扫描器)

2) 每行单独(行语法)

3) 行块(编程语言语法)

我的问题: 解析步骤是2?还是3?还是2&3?
我认为这不是解析器的标准方法。如果我想对了,有什么不对?解决方案是什么?

不,它不是标准的,而且几乎肯定不会起作用。首先,在大多数编程语言中,行是无关紧要的。另一方面,订单检查不是一个明确的阶段。这都是语法识别的一部分。太宽了,这里盖不住。我建议你读一本好书。

当然,我的写作方法是语法。例如:func->begin stm end;stm->for | if | assignment | var | u defSo为什么不这么说?通过使用非标准语言,您已经进入了非标准领域。您正在解析哪种语言?该语言是否要求每行只包含一条语句/声明/任何内容?如果是这样的话,一次解析一行(像老式的BASIC)可能是有意义的。是的!例如,每行一条语句。您仍然有两个不同的语法,一个用于行,一个用于行块。定义一个语法,并将行尾视为该语法中的标记可能更有意义。看看coursera Aiken教授的编译器课程,不难理解,您将很好地掌握这些基础知识。安德鲁·阿佩尔的书也是一个“温和的介绍”。