-
Notifications
You must be signed in to change notification settings - Fork 0
GITHUBear/Lava-Compiler
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Feature: operator: 1. 一元运算: ++, --, !, ~ ++,--应前后缀 2. 逻辑运算: ||, && 3. 位运算符: &, |, ^, <<, >> 4. 算术运算: +, -, *, /, % 5.关系运算: >, >=, <, <=, ==, != 6. 复合赋值运算: +=, -=, *=, /=, %= 7.赋值运算: = 控制流: for loop, while loop 判断语句: if, else 数据类型: char, int, float, 一维数组 1. 词法分析器 2. 语法分析器 Rules: 0: program ::= deflist. 1: deflist ::= tp def deflist. 2: deflist ::=. 3: tp ::= INT. 4: tp ::= FLOAT. 5: tp ::= CHAR. 6: tp ::= INT LMB INUM RMB. 7: tp ::= FLOAT LMB INUM RMB. 8: tp ::= CHAR LMB INUM RMB. 9: vallist ::= ID COMMA vallist. [COMMA precedence=1] 10: vallist ::= ID. 11: def ::= vallist SEMICOLON. 12: def ::= fundef compstmt. 13: fundef ::= ID LLB args RLB. 14: fundef ::= ID LLB RLB. 15: args ::= param COMMA args. [COMMA precedence=1] 16: args ::= param. 17: param ::= tp ID. 18: compstmt ::= LGB innerdeflist stmtlist RGB. 19: innerdeflist ::= innerdef innerdeflist. 20: innerdeflist ::=. 21: innerdef ::= tp innerdeclist SEMICOLON. 22: innerdeclist ::= innerdec COMMA innerdeclist. [COMMA precedence=1] 23: innerdeclist ::= innerdec. 24: innerdec ::= ID ASSIGN exp. [ASSIGN precedence=2] 25: innerdec ::= ID. 26: stmtlist ::= stmt stmtlist. 27: stmtlist ::=. 28: stmt ::= compstmt. 29: stmt ::= exp SEMICOLON. 30: stmt ::= RETURN exp SEMICOLON. 31: stmt ::= IF LLB exp RLB stmt. [LOWELSE precedence=13] 32: stmt ::= IF LLB exp RLB stmt ELSE stmt. [ELSE precedence=14] 33: stmt ::= WHILE LLB exp RLB stmt. 34: stmt ::= FOR LLB initlist SEMICOLON exp SEMICOLON steplist RLB stmt. 35: initlist ::= init COMMA initlist. [COMMA precedence=1] 36: initlist ::= init. 37: init ::= ID ASSIGN exp. [ASSIGN precedence=2] 38: init ::= ID ADDEQ exp. [ADDEQ precedence=2] 39: init ::= ID MINUSEQ exp. [MINUSEQ precedence=2] 40: steplist ::= step COMMA steplist. [COMMA precedence=1] 41: steplist ::= step. 42: step ::= BIADD ID. [BIADD precedence=12] 43: step ::= ID BIADD. [BIADD precedence=12] 44: step ::= BIMINUS ID. [BIMINUS precedence=12] 45: step ::= ID BIMINUS. [BIMINUS precedence=12] 46: step ::= ID ASSIGN exp. [ASSIGN precedence=2] 47: exp ::= exp BIAND exp. [BIAND precedence=4] 48: exp ::= exp BIOR exp. [BIOR precedence=3] 49: exp ::= exp LSS exp. [LSS precedence=9] 50: exp ::= exp LSSEQ exp. [LSSEQ precedence=9] 51: exp ::= exp GRT exp. [GRT precedence=9] 52: exp ::= exp GRTEQ exp. [GRTEQ precedence=9] 53: exp ::= exp EQ exp. [EQ precedence=8] 54: exp ::= exp NOTEQ exp. [NOTEQ precedence=8] 55: exp ::= exp ADD exp. [ADD precedence=10] 56: exp ::= exp MINUS exp. [MINUS precedence=10] 57: exp ::= exp MULTI exp. [MULTI precedence=11] 58: exp ::= exp DIV exp. [DIV precedence=11] 59: exp ::= exp MOD exp. [MOD precedence=11] 60: exp ::= INUM. 61: exp ::= FNUM. 62: exp ::= ID. 63: exp ::= LLB exp RLB. 64: exp ::= NOT exp. [NOT precedence=12] 65: exp ::= exp AND exp. [AND precedence=7] 66: exp ::= exp OR exp. [OR precedence=5] 67: exp ::= exp XOR exp. [XOR precedence=6] 68: exp ::= exp BITNOT exp. [BITNOT precedence=12] 69: exp ::= exp COMMA exp. [COMMA precedence=1] 70: exp ::= ID LMB exp RMB. 71: exp ::= exp ASSIGN exp. [ASSIGN precedence=2] 72: exp ::= exp ADDEQ exp. [ADDEQ precedence=2] 73: exp ::= exp MINUSEQ exp. [MINUSEQ precedence=2] 74: exp ::= exp BIADD. [BIADD precedence=12] 75: exp ::= exp BIMINUS. [BIMINUS precedence=12] 76: exp ::= BIADD exp. [BIADD precedence=12] 77: exp ::= BIMINUS exp. [BIMINUS precedence=12] 78: exp ::= CNUM. 79: exp ::= ID LLB exp RLB. 80: exp ::= ID LLB RLB. 3. 语义分析与符号表生成 0: program ::= deflist. 1: deflist ::= tp {def.type = tp.type} def deflist. 2: deflist ::=. 3: tp ::= INT. {tp.type = INT} 4: tp ::= FLOAT. {tp.type = FLOAT} 5: tp ::= CHAR. {tp.type = CHAR} 6: tp ::= INT INUM. {tp.type = INT ARRAY} 7: tp ::= FLOAT INUM. {tp.type = FLOAT ARRAY} 8: tp ::= CHAR INUM. {tp.type = CHAR ARRAY} 9: vallist ::= {ID.type = vallist.type} ID{check ID.name into table} {vallist.type = vallist.type} vallist. {vallist.num = vallist.num + 1} [COMMA precedence=1] 10: vallist ::= {ID.type = vallist.type} ID. {vallist.num = 1; ID into table} 11: def ::= {vallist.type = def.type} vallist. {def.num = vallist.num} 12: def ::= {fundef.retype = def.type} fundef compstmt. {check compstmt.retype == def.type} 13: fundef ::= {} ID args{get linklist of types: args.types}.{fun ID into table} 14: fundef ::= {} ID.{fun ID into table} 15: args ::= {param.args = args.types}param{.args linklist add param.type} args.{args.num = args.num + 1} 16: args ::= {param.args = args.types}param.{.args linklist add param.type; args.num = 1} 17: param ::= tp ID.{check ID into table. param.type = tp.type, param.name = ID.name} 18: compstmt ::= innerdeflist stmtlist.{table level--; pop table; compstmt.retype = stmtlist.retype} 19: innerdeflist ::= innerdef innerdeflist.{innerdeflist.num = innerdef.num + innerdeflist.num} 20: innerdeflist ::=. 21: innerdef ::= tp {innerdeclist.type = tp.type} innerdeclist. {innerdef.num = innerdeclist.num} 22: innerdeclist ::= {innerdec.type = innerdeclist.type} innerdec {innerdeclist.type = innerdeclist.type} innerdeclist. {innerdeclist.num = innerdeclist.num + 1} [COMMA precedence=1] 23: innerdeclist ::= {innerdec.type = innerdeclist.type} innerdec.{innerdeclist.num = 1} 24: innerdec ::= {ID.type = innerdec.type} ID ASSIGN exp. {check exp.type == innerdec.type; check ID into table} [ASSIGN precedence=2] 25: innerdec ::= {ID.type = innerdec.type} ID. {check ID into table} 26: stmtlist ::= stmt stmtlist. {check; stmtlist.retype = stmt.retype || stmtlist.retype} 27: stmtlist ::=.{stmtlist.retype = void} 28: stmt ::= compstmt.{stmt.retype = compstmt.retype} 29: stmt ::= exp. 30: stmt ::= RETURN exp. {stmt.retype = exp.type} 31: stmt ::= IF exp {check exp.type == BOOLEXP} stmt. {stmt.retype = stmt.retype} [LOWELSE precedence=13] 32: stmt ::= IF exp {check exp.type == BOOLEXP} stmt ELSE stmt. {check return; stmt.retype} [ELSE precedence=14] 33: stmt ::= WHILE exp {check exp.type == BOOLEXP} stmt {stmt.retype = stmt.retype}. 34: stmt ::= FOR initlist exp {check exp.type == BOOLEXP} steplist stmt. {stmt.retype = stmt.retype} 35: initlist ::= init initlist. [COMMA precedence=1] 36: initlist ::= init. 37: init ::= ID {check ID reference} ASSIGN exp {check ID.type == exp.type}. [ASSIGN precedence=2] 38: init ::= ID {check ID reference} ADDEQ exp {exp.type == ID.type && (ID.type == INT || ID.type == FLOAT)}. [ADDEQ precedence=2] 39: init ::= ID {check ID reference} MINUSEQ exp {exp.type == ID.type && (ID.type == INT || ID.type == FLOAT)}. [MINUSEQ precedence=2] 40: steplist ::= step steplist. [COMMA precedence=1] 41: steplist ::= step. 42: step ::= BIADD ID {check ID reference}. [BIADD precedence=12] 43: step ::= ID {check ID reference} BIADD. [BIADD precedence=12] 44: step ::= BIMINUS ID {check ID reference}. [BIMINUS precedence=12] 45: step ::= ID {check ID reference} BIMINUS. [BIMINUS precedence=12] 46: step ::= ID {check ID reference} ASSIGN exp {check ID.type == exp.type}. [ASSIGN precedence=2] 47: exp ::= exp {check exp.type == BOOLEXP} BIAND exp {check exp.type == BOOLEXP; exp.type == BOOLEXP}. [BIAND precedence=4] 48: exp ::= exp {check exp.type == BOOLEXP} BIOR exp {check exp.type == BOOLEXP; exp.type == BOOLEXP}. [BIOR precedence=3] 49: exp ::= exp LSS exp. [LSS precedence=9] (the same as above) 50: exp ::= exp LSSEQ exp. [LSSEQ precedence=9] (the same as above) 51: exp ::= exp GRT exp. [GRT precedence=9] (the same as above) 52: exp ::= exp GRTEQ exp. [GRTEQ precedence=9] (the same as above) 53: exp ::= exp EQ exp. [EQ precedence=8] (the same as above) 54: exp ::= exp NOTEQ exp. [NOTEQ precedence=8] (the same as above) 55: exp ::= exp ADD exp {check exp1.type == exp2.type && exp1.type != BOOLEXP; exp.type = exp1.type}. [ADD precedence=10] 56: exp ::= exp MINUS exp {check exp1.type == exp2.type && exp1.type != BOOLEXP; exp.type = exp1.type}. [MINUS precedence=10] 57: exp ::= exp MULTI exp {check exp1.type == exp2.type && exp1.type != BOOLEXP; exp.type = exp1.type}. [MULTI precedence=11] 58: exp ::= exp DIV exp {check exp1.type == exp2.type && exp1.type != BOOLEXP; exp.type = exp1.type}. [DIV precedence=11] 59: exp ::= exp MOD exp {check exp1.type == exp2.type && exp1.type != BOOLEXP; exp.type = exp1.type}. [MOD precedence=11] 60: exp ::= INUM. {exp.type = INTEXP} 61: exp ::= FNUM. {exp.type = FLOATEXP} 62: exp ::= ID. {exp.type = ID.type; exp.canLeft = 1} 63: exp ::= exp. {exp.type = exp.type; exp.canLeft = exp.canLeft} 64: exp ::= NOT exp {check exp.type = BOOLEXP}. [NOT precedence=12] 65: exp ::= exp {check exp.type == INTEXP} AND exp {check exp.type == INTEXP; exp.type = INTEXP}. [AND precedence=7] 66: exp ::= exp OR exp. [OR precedence=5] (the same as above) 67: exp ::= exp XOR exp. [XOR precedence=6] (the same as above) 68: exp ::= exp BITNOT exp. [BITNOT precedence=12] (the same as above) 69: exp ::= exp exp. {exp.type = UNDEFINEXP} [COMMA precedence=1] 70: exp ::= ID {check ID reference} exp {check exp.type = INTEXP}. {exp.type = ID.type - ARRAY; exp.canLeft = 1} 71: exp ::= exp {check exp.canLeft == 1} ASSIGN exp {check exp2.type == exp1.type; exp.type = exp1.type}. {check exp.type} [ASSIGN precedence=2] 72: exp ::= exp {check exp.type != BOOLEXP && exp.canLeft == 1} ADDEQ exp {check exp.type != BOOLEXP && exp1.type == exp2.type; exp.type = exp1.type}. [ADDEQ precedence=2] 73: exp ::= exp MINUSEQ exp. [MINUSEQ precedence=2] (the same as above) 74: exp ::= exp {check exp.canLeft == 1 exp.type == INTEXP} BIADD {exp.type = exp.type}. [BIADD precedence=12] 75: exp ::= exp BIMINUS. [BIMINUS precedence=12] 76: exp ::= BIADD exp. [BIADD precedence=12] 77: exp ::= BIMINUS exp. [BIMINUS precedence=12] 78: exp ::= CNUM {exp.type = CHAREXP}. 79: exp ::= ID {check ID references Function} {exp.types = exp.types} exp{check types} {exp.type = ID.type}. 80: exp :: ID LLB RLB. 4. 中间代码生成 0: program ::= deflist. 1: deflist ::= tp def deflist. 2: deflist ::=. 3: tp ::= INT. 4: tp ::= FLOAT. 5: tp ::= CHAR. 6: tp ::= INT LMB INUM RMB. 7: tp ::= FLOAT LMB INUM RMB. 8: tp ::= CHAR LMB INUM RMB. 9: vallist ::= ID COMMA vallist. [COMMA precedence=1] 10: vallist ::= ID. 11: def ::= vallist SEMICOLON. 12: def ::= fundef compstmt. 13: fundef ::= ID LLB args RLB. 14: fundef ::= ID LLB RLB. 15: args ::= param COMMA args. [COMMA precedence=1] 16: args ::= param. 17: param ::= tp ID. 18: compstmt ::= LGB innerdeflist stmtlist RGB. 19: innerdeflist ::= innerdef innerdeflist. 20: innerdeflist ::=. 21: innerdef ::= tp innerdeclist SEMICOLON. 22: innerdeclist ::= innerdec COMMA innerdeclist. [COMMA precedence=1] 23: innerdeclist ::= innerdec. 24: innerdec ::= ID ASSIGN exp. [ASSIGN precedence=2] 25: innerdec ::= ID. 26: stmtlist ::= stmt stmtlist. 27: stmtlist ::=. 28: stmt ::= compstmt. 29: stmt ::= exp SEMICOLON. 30: stmt ::= RETURN exp SEMICOLON. 31: stmt ::= IF LLB exp RLB stmt. [LOWELSE precedence=13] 32: stmt ::= IF LLB exp RLB stmt ELSE stmt. [ELSE precedence=14] 33: stmt ::= WHILE LLB exp RLB stmt. 34: stmt ::= FOR LLB initlist SEMICOLON exp SEMICOLON steplist RLB stmt. 35: initlist ::= init COMMA initlist. [COMMA precedence=1] 36: initlist ::= init. 37: init ::= ID ASSIGN exp. [ASSIGN precedence=2] 38: init ::= ID ADDEQ exp. [ADDEQ precedence=2] 39: init ::= ID MINUSEQ exp. [MINUSEQ precedence=2] 40: steplist ::= step COMMA steplist. [COMMA precedence=1] 41: steplist ::= step. 42: step ::= BIADD ID. [BIADD precedence=12] 43: step ::= ID BIADD. [BIADD precedence=12] 44: step ::= BIMINUS ID. [BIMINUS precedence=12] 45: step ::= ID BIMINUS. [BIMINUS precedence=12] 46: step ::= ID ASSIGN exp. [ASSIGN precedence=2] 47: exp ::= exp BIAND exp. [BIAND precedence=4] 48: exp ::= exp BIOR exp. [BIOR precedence=3] 49: exp ::= exp LSS exp. [LSS precedence=9] 50: exp ::= exp LSSEQ exp. [LSSEQ precedence=9] 51: exp ::= exp GRT exp. [GRT precedence=9] 52: exp ::= exp GRTEQ exp. [GRTEQ precedence=9] 53: exp ::= exp EQ exp. [EQ precedence=8] 54: exp ::= exp NOTEQ exp. [NOTEQ precedence=8] 55: exp ::= exp ADD exp. [ADD precedence=10] 56: exp ::= exp MINUS exp. [MINUS precedence=10] 57: exp ::= exp MULTI exp. [MULTI precedence=11] 58: exp ::= exp DIV exp. [DIV precedence=11] 59: exp ::= exp MOD exp. [MOD precedence=11] 60: exp ::= INUM. 61: exp ::= FNUM. 62: exp ::= ID. 63: exp ::= LLB exp RLB. 64: exp ::= NOT exp. [NOT precedence=12] 65: exp ::= exp AND exp. [AND precedence=7] 66: exp ::= exp OR exp. [OR precedence=5] 67: exp ::= exp XOR exp. [XOR precedence=6] 68: exp ::= exp BITNOT exp. [BITNOT precedence=12] 69: exp ::= exp COMMA exp. [COMMA precedence=1] 70: exp ::= ID LMB exp RMB. 71: exp ::= exp ASSIGN exp. [ASSIGN precedence=2] 72: exp ::= exp ADDEQ exp. [ADDEQ precedence=2] 73: exp ::= exp MINUSEQ exp. [MINUSEQ precedence=2] 74: exp ::= exp BIADD. [BIADD precedence=12] 75: exp ::= exp BIMINUS. [BIMINUS precedence=12] 76: exp ::= BIADD exp. [BIADD precedence=12] 77: exp ::= BIMINUS exp. [BIMINUS precedence=12] 78: exp ::= CNUM. 79: exp ::= ID LLB exp RLB. 80: exp ::= ID LLB RLB.
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published