`
NeuronR
  • 浏览: 59846 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

[语法分析]前奏:怎么扩展

阅读更多

    现在完成的是一个词法分析器,那么怎么将它与语法分析相连?

    话说,基本上所有的编译器构造相关的文章都是把词法分析丢在语法分析之前,类似这样:

 

预处理(C语言为代表,Jerry没这一环) -> 词法分析 -> 语法分析 -> 语义分析 -> 中间代码生成和代码优化 ->目标代码

 

貌似互相独立的过程。然而从某种程度上来说,语法和词法应该“混为一谈”,并且建立语法树与后面的部分又相对分离(只共享数据结构信息)。

    为了达到这一目的,就得利用词法分析抽出的接口firstTokennextTokeneofToken这三个函数。如果采用LR分析法(我采用的语法分析的实现是SLR(1)的),那么流程可以这样:

firstToken:初始化(LR分析预测表),将一个特殊LR项目和对应状态值压入LR分析栈;

每一次nextToken:调用分析函数,将当前读入的符号扔进语法分析模块中处理,它可能被直接压入分析栈(移进项目),或者等待栈顶完成规约后再移进(规约项目);

eofToken:将特殊符号END传入扔进分析函数,然后结束语法分析,得到最终的语法树。

 

    从这个实现来看,语法分析是个急性子,它并不等所有的词法分析结束后再去符号池中从头到尾扫荡一次,而是每当词法分析获取一个符号就进行一次语法分析。

 

附:贴出所有Jerry语言的语法产生式,不过它们与上文内容无关(#表示注释一行)

# Jerry语言

 

Jerry -> BasicBlock <END>

 

# 基本块

# 严格地说, 基本块这样定义是不正确的, 不过在没有恼人的跳转语句( 包括goto 和 switch-case )的情况下, 可以这么搞

BasicBlock -> ε

BasicBlock -> Sentence BasicBlock

 

# 语句

Sentence -> <EOS>

Sentence -> IfElseBranch

Sentence -> WhileLoop

Sentence -> Declaration

Sentence -> <IO> Variable <EOS>

Sentence -> Assignment <EOS>

Sentence -> <BREAK> <EOS>

Sentence -> <LBRACE> BasicBlock <RBRACE>

 

# if-else 分支

IfElseBranch -> <IF> <LPARENT> Assignment <RPARENT> BasicBlock ElseBlock

ElseBlock -> <ELSE> BasicBlock

ElseBlock -> ε

 

# while 循环

WhileLoop -> <WHILE> <LPARENT> Assignment <RPARENT> BasicBlock

 

# 声明

# 初始化尚不支持数组

Declaration -> <TYPE> VariableRegister <EOS>

VariableRegister -> VariableRegister <COMMA> Variable Initialization

VariableRegister -> Variable Initialization

Initialization -> <ASSIGN> Assignment

Initialization -> ε

 

# 下面的产生式都是运算相关的劳什子

# 优先级高的运算, 要优先规约, 从产生式编写的角度来看, 它们在更靠后更"深"的地方

# 赋值 右结合所以递归定义的方式与其他的节点都不一样. 又因为等号优先级最低, 所以作为最"根部"的语法节点类型

Assignment -> Condition <ASSIGN> Assignment

Assignment -> Condition

 

# 条件 比较运算和逻辑运算符的结晶

Condition -> Condition <OR> ConjunctiveCondition

Condition -> ConjunctiveCondition


ConjunctiveCondition -> NegativeCondition

ConjunctiveCondition -> ConjunctiveCondition <AND> NegativeCondition


NegativeCondition -> <NOT> Comparison

NegativeCondition -> Comparison

 

# 比较运算

Comparison –> Comparison <COMPARATOR> Expression

Comparison -> Expression

 

# 表达式

Expression -> Expression <OP_MUL_DIV> Term

Expression -> Term

 

# 项

Term –> UnaryFactor

Term -> Term <OP_PLS_MNS> UnaryFactor

 

# 一元因子, 可能有正负号

UnaryFactor -> SimpleFactor

UnaryFactor -> <OP_PLS_MNS> SimpleFactor

 

# 简单因子

SimpleFactor -> <INTEGER>

SimpleFactor -> <REAL>

SimpleFactor -> Variable

SimpleFactor -> <LPARENT> Assignment <RPARENT>

 

# 变量( 包括数组下标等信息 )

Variable -> <IDENT> Dimensions

Dimensions -> <LBRACKET> Assignment <RBRACKET> Dimensions

Dimensions -> ε

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics