今后还要继续!

地震后的感悟与重启
自从地震后,就很少上来了,也再没在这儿发过什么帖子了。
这段时间发生的事情太多了,地震也经历了,公司团队中的各种变化也经历了。呵呵,感觉人生都丰富了许多。
我想今后我还是要继续在这上面发发牢骚,让我的朋友们多一个途径了解我的情况。
【问题描述】 请根据给定的文法设计并实现语法分析程序,能基于上次作业的词法分析程序所识别出的单词,识别出各类语法成分。输入输出及处理要求如下: (1)需按文法规则,用递归子程序法对文法中定义的语法成分进行分析; (2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名);结果文件中包含如下两种信息: 1)按词法分析识别单词的顺序,按行输出每个单词的信息(要求同词法分析作业,对于预读的情况不能输出)。 2)在文法中出现(除了<BlockItem>, <Decl>, <BType> 之外)的语法分析成分分析结束前,另起一行输出当前语法成分的名字,形如“<Stmt>”(注:未要求输出的语法成分仍需要进行分析,但无需输出) 文法: SysY 语⾔的⽂法表示如下,其中 CompUnit 为文法开始符号。 序号 含义 产生式左部 定义符号 产生式右部 备注 1 编译单元 CompUnit → {Decl} {FuncDef} MainFuncDef // 1.是否存在Decl 2.是否存在FuncDef 2 声明 Decl → ConstDecl | VarDecl // 覆盖两种声明 3 函数定义 FuncDef → FuncType Ident '(' [FuncFParams] ')' Block // 1.⽆形参 2.有形 参 4 主函数定义 MainFuncDef → 'int' 'main' '(' ')' Block // 存在main函数 5 常量声明 ConstDecl → 'const' BType ConstDef { ',' ConstDef } ';' // 花括号内重复0次或多次,单引号引起来的是终结符 6 变量声明 VarDecl → BType VarDef { ',' VarDef } ';' // 花括号内重复0次或多次 7 函数类型 FuncType → 'void' | 'int' | 'float' // 覆盖两种类型的函数 8 标识符 Ident → identifier-nondigit | identifier identifier-nondigit | identifier digit 词法分析 9 函数形参表 FuncFParams → FuncFParam { ',' FuncFParam } // 花括号内重复0次或多次 10 语句块 Block → {' { BlockItem } '}' // 花括号内重复0次或多次 11 基本类型 BType → 'int'|'float' // 存在即可 12 变量定义 VarDef → Ident { '[' ConstExp ']' } | Ident { '[' ConstExp ']' } '=' InitVal // 包含普通变量、⼀维数组、⼆维数组定义 13 函数形参 FuncFParam → BType Ident ['[' ']' { '[' ConstExp ']' }] // 1.普通变量 2.⼀维数组变量 3.⼆维数组变量 14 语句块项 BlockItem → Decl | Stmt // 覆盖两种语句块项 15 常量表达式 ConstExp → AddExp 注:使⽤的Ident 必须是常量 // 存在即可 16 变量初值 InitVal → Exp | '{' [ InitVal { ',' InitVal } ] '}' // 1.表达式初值 2.⼀维数组初值 3.⼆维数组初值 17 语句 Stmt → LVal '=' Exp ';' | [Exp] ';'| Block | 'if' '(' Cond ')' Stmt ['else' Stmt] | 'while' '(' Cond ')' Stmt | 'break' ';' | 'continue' ';' | 'return' [Exp] ';' | LVal '=' 'getint''('')'';' | 'printf''('FormatString{','Exp}')'';' // 1.每种类型的语句都要覆盖;//2.有⽆Exp两种情况;// 4.有else和⽆else; // 7.有⽆Exp两种情况; // 10.有⽆Exp两种情况 18 加减表达式 AddExp → MulExp | AddExp ('+' | '−') MulExp // 1.MulExp 2.+ 需覆盖 3.-需覆盖 19 表达式 Exp → AddExp 注:SysY 表达式是int 型表达式 // 存在即可 20 左值表达式 LVal → Ident {'[' Exp ']'} //1.普通变量 2.⼀维数组 3.⼆维数组 21 条件表达式 Cond → LOrExp // 存在即可 22 格式字符串终结符 FormatString → '"'{<Char>}'"' 词法分析 23 乘除模表达式 MulExp → UnaryExp | MulExp ('*' | '/' | '%') UnaryExp //1.UnaryExp 2.* 3./ 4.% 均需覆盖 24 逻辑或表达式 LOrExp → LAndExp | LOrExp '||' LAndExp // 1.LAndExp 2.|| 均需覆盖 25 逻辑与表达式 LAndExp → EqExp | LAndExp '&&' EqExp // 1.EqExp 2.&& 均需覆盖 26 相等性表达式 EqExp → RelExp | EqExp ('==' | '!=') RelExp // 1.RelExp 2.== 3.!=均需覆盖 27 ⼀元表达式 UnaryExp → PrimaryExp | Ident '(' [FuncRParams] ')'|UnaryOp UnaryExp // 3种情况均需覆盖,函数调⽤也需要覆盖FuncRParams的不同情况 28 关系表达式 RelExp → AddExp | RelExp ('<' | '>' | '<=' | '>=') AddExp // 1.AddExp 2.< 3.> 4.<= 5.>= 均需覆盖 29 <Char> → <FormatChar> | <NormalChar> 词法分析 30 <FormatChar> → %d 词法分析 31 <NormalChar> → ⼗进制编码为32,33,40-126的ASCII字符,'\'(编码92)出现当且仅当为'\n' 词法分析:为了与 gcc 评测结果⼀致,( <NormalChar>的转义字符有且仅有 '\n',其余情况,'\' 单独出现是不合法的) 32 基本表达式 PrimaryExp → '(' Exp ')' | LVal | Number // 三种情况均需覆盖 33 函数实参表 FuncRParams → Exp { ',' Exp } // 1.花括号内重复0次 2.花括号内重复多次 3.Exp需要覆盖数组传参和部分数组传参 34 数值 Number → IntConst // 存在即可 35 整数 IntConst → decimal-const | 0 词法分析 36 十进制数 decimal-const → nonzero-digit | decimal-const digit 词法分析 37 非零数字 nonzero-digit → 1|2|3|4|5|6|7|8|9 词法分析 38 单目运算符 UnaryOp → '+' | '-' | '!' //'!'仅出现在条件表达式中 39 常量初值 ConstInitVal → ConstExp | '{'[ConstInitVal{','ConstInitVal}] '}' 40 常数定义 ConstDef → Ident{'['ConstExp']'} | Ident{'['ConstExp']'}'='ConstInitVal 【输入形式】testfile.txt中的符合文法要求的测试程序。 【输出形式】按如上要求将语法分析结果输出至output.txt中。 【特别提醒】(1)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。 (2)当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。 【样例输入】 int main(){ int c; c= getint(); printf("%d",c); return c; } 【样例输出】 INTTK int MAINTK main LPARENT ( RPARENT ) LBRACE { INTTK int IDENFR c <VarDef> SEMICN ; <VarDecl> IDENFR c <LVal> ASSIGN = GETINTTK getint LPARENT ( RPARENT ) SEMICN ; <Stmt> PRINTFTK printf LPARENT ( STRCON "%d" COMMA , IDENFR c <LVal> <PrimaryExp> <UnaryExp> <MulExp> <AddExp> <Exp> RPARENT ) SEMICN ; <Stmt> RETURNTK return IDENFR c <LVal> <PrimaryExp> <UnaryExp> <MulExp> <AddExp> <Exp> SEMICN ; <Stmt> RBRACE } <Block> <MainFuncDef> <CompUnit>
11-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值