语法分析器代码分析报告

语法分析器代码分析报告

一、语法分析器设计思路说明

该语法分析器基于LL(1)文法和递归下降方法进行设计。
LL(1)文法是进行不带回溯的确定的自上而下分析所必须满足的文法条件。其包含三方面的要求。
(1) 文法不含左递归
(2) 对文法中的任一个非终结符A的各个候选式的首终结符集两两不相交,即:若
Aα1|α2|…|αn ,则
First(ai)∩ First(aj) = φ ( i ≠ j )
(3) 对文法中的每个非终结符A,若它的某个首终结符集含有ε,则
First(A)∩ Follow(A) = φ
递归下降方法是为每个非终结符编制一个递归下降分析函数,每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构和顺序编写的。
(1)当遇到终结符a时,则编写语句if(当前读来的输入符号==a)读下一个输入符号。
(2)当遇见非终结符A时,则编写语句调用A();
(3)当遇见规则A->ε时,则编写语句if(当前读来的输入符号串∉FOLLOW(A))error();
(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导。

二、TinyScript的语法要求

文法:
Program -> Stmts -> Stmt Stmts | ε

Stmt->AssignStmt|DeclareStmt|FunctionDeclareStmt|ReturnStmt|IfStmt|Block|Expr

Block -> { stmts }

变量赋值:AssignStmt -> Variable = Expr

变量定义:DeclareStmt -> var Variable = Expr

方法声明:FunctionDeclareStmt->func Variable() KEYWORD{}|func Variable(Variable,Variable) KEYWORD {}

返回值:ReturnStmt->return Expr

判断:IfStmt->If(Expr) Block Tail
Tail -> else {Block} | else IFStmt | ε

代码块:Block->{stmts}

表达式:Expr->left|right|最高优先级处理
left:E(k) -> E(k) op(k) E(k+1) | E(k+1)

right:
E(k) -> E(k+1) E_(k)
E_(k) -> op(k) E(k+1) E_(k) | ε

最高优先级处理:
E(t) -> F E_(k) | U E_(k)
E_(t) -> op(t) E(t) E_(t) | ε

三、语法分析器代码分析

继承关系图:

AssignStmt:
在这里插入图片描述
Block:
在这里插入图片描述
CallExpr:
在这里插入图片描述
DeclareStmt:
在这里插入图片描述
Expr:
在这里插入图片描述
Factor:
在这里插入图片描述
ForStmt:
在这里插入图片描述
FunctionArgs:
在这里插入图片描述
FunctionDeclareStmt:
在这里插入图片描述

IfStmt:
在这里插入图片描述
Program:
在这里插入图片描述
ReturnStmt:
在这里插入图片描述
Scalar:
在这里插入图片描述

Stmt:
在这里插入图片描述

Variable:
在这里插入图片描述

类分析
  1. ASTNode类定义了抽象语法树的数据结构,设置了相应的get、set方法,addChild(ASTNode node)方法作用为添加儿子节点。

  2. Stmt类parseStmt(PeekTokenIterator it)方法用来循环读入单词通过匹配固定的单词来判断所进行的操作。

  3. AssignStmt类的parse(PeekTokenIterator it)方法文法进行了抽象,通过var factor = Factor.parse(it);读入一个单词如果单词类型匹配,继续通过it.nextMatch(“=”)匹配声明语句中的语法单元“=”,并通过Expr.parse(it)匹配一个表达式以完成赋值语句的识别分析。

  4. IfStmt类的parse(PeekTokenIterator it)方法对文法进行了抽象,首先it.nextMatch(“if”)匹配固定的关键字if,如果匹配成功则通过it.nextMatch(“(”)匹配左括号,然后通过Expr.parse(it)获条件表达式,加入子节点,在通过it.nextMatch(“)”)匹配右括号,如果匹配成功,则通过Block.parse(it)识别代码块,在通过parseTail(it)识别其他分支,完成判断语句的识别分析。

  5. Program类parse(PeekTokenIterator it)方法对文法进行了抽象,通过while( (stmt = Stmt.parseStmt(it)) != null)循环识别程序块,从而完成整个程序块的识别。

  6. DeclareStmt类的parse(PeekTokenIterator it)方法对文法进行了抽象,首先通过it.nextMatch(“var”)匹配固定的关键字var,然后通过Factor.parse(it)从输入流中匹配一个元素(变量名)。如果匹配成功,则继续通过it.nextMatch(“=”)匹配声明语句中的语法单元“=”,并通过Expr.parse(it)匹配一个表达式以完成声明语句的识别分析。

  7. Block类的parse(PeekTokenIterator it)方法对文法进行了抽象,首先通过it.nextMatch(“{”)匹配左花括号,如果匹配成功则while( (stmt =Stmt.parseStmt(it)) !=null)循环读入程序块中的内容,最后通过it.nextMatch(“}”)识别右花括号,完成程序块的识别。

  8. CallExpr类的parse(ASTNode factor, PeekTokenIterator it)方法对文法进行了抽象,首先通过expr.addChild(factor)将读入的单词加入子节点,然后通过it.nextMatch(“(”)识别左括号,如果匹配成功通过while((p= Expr.parse(it)) != null)循环匹配函数参数,最后通过it.nextMatch(“)”)识别右括号完成对调用语句的识别。

  9. Expr类作用为对其他类型的语法进行处理。

  10. Factor类parse(PeekTokenIterator it)方法用来对读入的单词进行分类处理,首先通过if(type == TokenType.VARIABLE)判断是否为变量,如果判断正确返回Variable(token),如果不成功则通过else if(token.isScalar())判断单词是否为int、float等类型返回Scalar(token),完成对单词操作的分类。

  11. FunctionDeclareStmt类的parse(PeekTokenIterator it)方法用来识别方法声明语句,首先通过it.nextMatch(“func”)识别固定关键字func然后通过(Variable)Factor.parse(it)获取下一个单词并且将他加入子节点,然后在通过it.nextMatch(“(”)识别左括号,如果匹配成功则通过FunctionArgs.parse(it)匹配方法的参数,通过it.nextMatch(“)”)匹配右括号结束,通过functionVariable.setTypeLexeme(keyword)将方法名设置成关键字,在通过func.addChild(block)识别方法体,完成对方法声明语句的识别。

  12. ReturnStmt类用来识别返回语句,首先通过it.nextMatch(“return”)匹配固定关键字return如果匹配成功则通过Expr.parse(it)识别后面的返回值,完成对返回语句的识别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值