Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 4

Helpers digit = ['0' .. '9'] ; nondigit = ['_' + [['a' .. 'z'] + ['A' .. 'Z']]]; all = [0 .. 0xffff]; letter = [['a' ..

'z'] + ['A' .. 'Z']]; sp = ' ' ; nl = 10 ; nonzero_digit = ['1' .. '9']; decimal = nonzero_digit digit*; aspa = '"'; cadeia_h = aspa letter* aspa; States normal, comment; Tokens int_constant = decimal; add = '+'; sub = '-'; mod = '%'; igual = '=='; else = 'else'; main = 'main'; if='if'; int='int'; string='string'; return ='return'; void='void'; while='while'; atribuicao = '='; diferente = '!='; maior = '>'; menor = '<'; maiorouigual = '>='; menorouigual = '<='; left_paren = '('; right_paren = ')'; left_colc = '['; right_colc = ']'; left_chave = '{'; right_chave = '}'; {normal} id = letter+; cadeia = cadeia_h; fim = ';'; comma = ','; comentariolinha = '//'; whitespace = (' ')+; {normal} blank = (' ' | 10 | 13 | 9)*; {normal->comment, comment} left_com = '/*'; {comment} right_com = '*/'; {normal,comment} mul = '*'; {normal,comment} div = '/'; {comment} comment_body = [all -['*' + '/']]*; Ignored Tokens whitespace, comment_body, comentariolinha,

blank, left_com, right_com; Productions program = decl_list main_decl {-> New program([decl_list.id, decl_list.statement ], function_body)}; void_specifier = void; int_specifier = int; string_specifier = string; type_specifier = {void} {string} {int} void_specifier | string_specifier | int_specifier ;

array_declarator {->id}= {identifier} id left_colc int_constant? right_colc {->id}| {array} array_declarator left_colc int_constant? right_colc {->i d}; direct_declarator {->id} = {identifier} id {-> id}| {array} array_declarator {->id}; declarator {->id}= {direct} direct_declarator {->id}; variable_decl {-> id}= type_specifier declarator fim {->id}; parameter_declaration = type_specifier declarator; parameter_list_fim = comma parameter_declaration; parameter_list = parameter_declaration parameter_list_fim*; function_declarator {-> id*}= {identifier} id left_paren parameter_list? right_p aren {-> [id] }; function_body = left_chave variable_decl* statement* retorno? right_chave {-> [v ariable_decl.id, statement]}; function_decl = type_specifier function_declarator function_body {-> [function_d eclarator.id, function_body]}; main_decl_body = left_paren void_specifier right_paren function_body {-> functio n_body}; main_decl = void_specifier main main_decl_body {->function_body}; decl_list = {function_decl_list} function_decl* {-> [function_decl.id,function_d ecl.statement ]}; decl = {function_decl} function_decl | {variable_decl} variable_decl;

value = {identifier} id | {constant} int_constant;

retorno = {return} return fim | /*{return_value} return value fim;*/ {return_exp} return arit_exp fim; composto_statement = left_chave statement* retorno? right_chave; arglist_fim = comma id; arglist = id arglist_fim*; relop = {maior} maior | {menor} menor | {diferente} diferente | {maigual} maiorouigual | {meigual} menorouigual; binop = {relop} relop | {add} add | {sub} sub | {mod} mod | {div} div | {mul} mul; binaria_expression = left_paren [left]:value binop [right]:value right_paren; chamada_expression = id left_paren arglist? right_paren; entrada_atrib = {aritmetica} arit_exp | {stringcadeia} cadeia | {variavel} id; atr_expression = id atribuicao entrada_atrib; simples_expression = {variavel} id | {constante} int_constant; basico_statement = {call_expression} chamada_expression | {modify_expression} atr_expression | {simples} simples_expression; condicional_expression = {rel} left_paren [esq]:value relop [dir]:value right_paren | {value} value;

statement = {comp_stmt} composto_statement {-> condicional_expression.statement} | {basic_stmt} basico_statement fim {-> basico_statement.statement}| {if} if left_paren condicional_expression right_paren compost o_statement {-> [condicional_expression.statement, composto_statement.statement] }| {if_then_else} if left_paren condicional_expression right_paren [then_co mp_stmt]:composto_statement else [else_comp_stmt]:composto_statement | {if_else} if left_paren condicional_expression right_paren fim els e composto_statement {-> [condicional_expression.statement, composto_statement.s tatement]} | {while} while left_paren condicional_expression right_paren comp osto_statement; arit_exp {-> expr} = {add} [left]:arit_exp add [right]:factor {-> New expr.add (left.expr, right.expr)} | {sub} [left]:arit_exp sub [right]:factor {-> New expr.sub(left.expr, right.expr)} | {factor} factor {-> fact or.expr}; factor {-> expr} = {mul} [left]:factor mul [right]:valor (left.expr, right.expr)} | {div} [left]:factor div [right]:valor (left.expr, right.expr)} | {valor} valor {-> New expr.mul {-> New expr.div {-> valor.expr};

valor {-> expr} = {number} int_constant {-> New expr.num ber(number)} | {parens} left_paren arit_exp right_paren {-> expr.expr}; Abstract Syntax Tree program = id* statement* id* statement*; expr = {add} [expr1]:expr [expr2]:expr | {sub} [expr1]:expr [expr2]:expr {mul} [expr1]:expr [expr2]:expr {div} [expr1]:expr [expr2]:expr {number} int_constant {expr} expr; | | | |

You might also like