设计并实现一个简单的类C编程语言
设计一个支持函数递归调用的程序语言,学习编译器原理。
程序代码样例
function factorial(n)
{
if (n == 0) {
return 1;
}else {
return factorial(n-1)*n;
}
}
function f2(n)
{
m = 1;
while(n>0)
{
m = m*n;
n = n - 1;
}
return m;
}
function max(x,y) {
if (x > y){
return x;
}
return y;
}
print factorial(5);
print f2(max(1,5));
词法分析
import ply.lex as lex
language_reserved_words = {
"if" : 'IF',
"else" : 'ELSE',
"while" : 'WHILE',
'function':'FUNCTION',
'return' : 'RETURN',
'print' : 'PRINT'}
tokens = ['PLUS','MINUS','TIMES','DIVIDE','EQS','INTEGER','IDENT','SEMICOLON','LB','RB','LCB','RCB','EQ',
'NE','GT','GE','LT','LE','COMMA'] + list(language_reserved_words.values())
t_ignore =' \t'
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQS = r'='
t_SEMICOLON = r';'
t_LB = r'\('
t_RB = r'\)'
t_LCB = r'{'
t_RCB = r'}'
t_EQ = r"=="
t_NE = r"!="
t_GT = r">"
t_GE = r">="
t_LT = r"<"
t_LE = r"<="
t_COMMA = r','
def t_PRINT(t):
"print"
return t
def t_FUNCTION(t):
"function"
return t
def t_RETURN(t):
"return"
return t
def t_WHILE(t):
"while"
return t
def t_IF(t):
"if"
return t
def t_ELSE(t):
"else"
return t
def t_INTEGER(t):
r'(?:[1-9][0-9]*)|0'
t.value = int(t.value)
return t
def t_IDENT(t):
r'[a-zA-Z_][a-zA-Z0-9_]*'
return t
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
# Error handling rule
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
mylex = lex.lex(debug=False)
语法分析和解释器
import ply.yacc as yacc
from mylex import tokens, mylex
sym_tbl = dict()
class AstNode: pass
class BinOp(AstNode):
"""
二元运算
"""
def __init__(self,left,op,right):
self.left_ = left
self.right_ = right
self.op_ = op
class Assignment(AstNode):
def __init__(self,ident,expr):
self.ident_ = ident
self.expr_ = expr
class Ident(AstNode):
def __init__(self,name) -> None:
super().__init__()
self.name_ = name
class Integer(AstNode):
def __init__(self,value) -> None:
super().__init__()
self.value_ = value
class Brace(AstNode):
def __init__(self,expr) -> None:
super().__init__()
self.expr_ = expr
class StmtList