diff --git a/ccmeta.leg b/ccmeta.leg index 77a0fa0..8bda2ce 100644 --- a/ccmeta.leg +++ b/ccmeta.leg @@ -35,17 +35,17 @@ #define META_PROTO_MAX t_Try -#define DO_C_PROTOS() \ - _DO(Comment) _DO(Token) \ - _DO(C_declaration) _DO(C_stringLiteral) \ +#define DO_C_PROTOS() \ + _DO(Comment) _DO(Token) \ + _DO(C_declaration) _DO(C_stringLiteral) \ _DO(C_if) _DO(C_int) _DO(C_float) _DO(C_string) _DO(C_char) _DO(C_id) _DO(C_while) _DO(C_do) _DO(C_for) \ - _DO(C_binary) _DO(C_initializer) _DO(C_range) _DO(C_conditional) _DO(C_index) \ - _DO(C_designation) _DO(C_attribution) _DO(C_deref) _DO(C_block) _DO(C_call) _DO(C_subexpr) \ - _DO(C_array) _DO(C_parameter) _DO(C_typeOf) _DO(C_unary) _DO(C_prefix) _DO(C_alignOf) \ - _DO(C_sizeOf) _DO(C_cast) _DO(C_attributeSpec) _DO(C_asm) _DO(C_asmExpr) _DO(C_asmExprArg) \ - _DO(C_aggregate) _DO(C_attribute) _DO(C_postfix) _DO(C_compound) _DO(C_functionDef) \ - _DO(C_exprStatement) _DO(C_switch) _DO(C_goto) _DO(C_continue) _DO(C_break) _DO(C_return) \ - _DO(C_case) _DO(C_default) _DO(C_label) _DO(C_labelDeclaration) _DO(C_structSpec) \ + _DO(C_binary) _DO(C_initializer) _DO(C_range) _DO(C_conditional) _DO(C_index) \ + _DO(C_designation) _DO(C_attribution) _DO(C_deref) _DO(C_block) _DO(C_call) _DO(C_subexpr) \ + _DO(C_array) _DO(C_parameter) _DO(C_typeOf) _DO(C_unary) _DO(C_prefix) _DO(C_alignOf) \ + _DO(C_sizeOf) _DO(C_cast) _DO(C_attributeSpec) _DO(C_asm) _DO(C_asmExpr) _DO(C_asmExprArg) \ + _DO(C_aggregate) _DO(C_attribute) _DO(C_postfix) _DO(C_compound) _DO(C_functionDef) \ + _DO(C_exprStatement) _DO(C_switch) _DO(C_goto) _DO(C_continue) _DO(C_break) _DO(C_return) \ + _DO(C_case) _DO(C_default) _DO(C_label) _DO(C_labelDeclaration) _DO(C_structSpec) \ _DO(C_structDeclarator) _DO(C_enumSpec) _DO(C_enum) typedef enum { @@ -1367,7 +1367,7 @@ integerConstant = < ( hexadecimalConstant | binaryConstant &{gnu} | decimalConstant ) integerSuffix? - > { $$ = new_C_int(yytext); } - + > { $$= new_C_int(yytext); } - decimalConstant = [1-9][0-9]* @@ -1389,7 +1389,7 @@ imaginarySuffix = [ij] # 6.4.4.2 -floatingConstant = <( decimalFloatingConstant | hexadecimalFloatingConstant )> { $$ = new_C_float(yytext); } - +floatingConstant = <( decimalFloatingConstant | hexadecimalFloatingConstant )> { $$= new_C_float(yytext); } - decimalFloatingConstant = fractionalConstant exponentPart? floatingSuffix? @@ -1416,8 +1416,8 @@ floatingSuffix = [fFlL] imaginarySuffix? # 6.4.4.4 -characterConstant = < "'" cCharSequence "'" > { $$ = new_C_char(yytext) } - - | < "L'" cCharSequence "'" > { $$ = new_C_char(yytext) } - +characterConstant = < "'" cCharSequence "'" > { $$= new_C_char(yytext) } - + | < "L'" cCharSequence "'" > { $$= new_C_char(yytext) } - cCharSequence = ( escapeSequence | !EOL [^\'\\] )* #' @@ -1928,7 +1928,7 @@ jumpStatement = g:GOTO i:id t:SEMI { $$= new_C_goto(g, ## translationUnit = externalDeclaration+ -externalDeclaration = { $$ = newComment(yytext); } +externalDeclaration = { $$= newComment(yytext); } | ( SEMI &{gnu} | declaration | functionDefinition @@ -2038,197 +2038,196 @@ stringLiteralList = s:stringLiteral { listWith(s) } ( c:COMMA s:stringLiteral { listAppend2(c, s) } )* { $$= listEnd() } -ids = i:id { listWith(i) } - ( c:COMMA i:id { listAppend2(c, i) } - )* { $$= listEnd() } +ids = i:id { listWith(i) } + ( c:COMMA i:id { listAppend2(c, i) } + )* { $$= listEnd() } ### -ASSIGN = '=' !'=' { $$= newToken("=" ) } - -COLON = ':' { $$= newToken(":" ) } - -COMMA = ',' { $$= newToken("," ) } - -QUESTION = '?' { $$= newToken("?" ) } - -SEMI = ';' { $$= newToken(";" ) } - - -PTR = "->" { $$= newToken("->" ) } - - -DOT = '.' !'.' { $$= newToken("." ) } - -ELLIPSIS = '...' { $$= newToken("..." ) } - - -LPAREN = '(' { $$= newToken("(" ) } - -RPAREN = ')' { $$= newToken(")" ) } - -LBRACKET = '[' { $$= newToken("[" ) } - -RBRACKET = ']' { $$= newToken("]" ) } - -LCURLY = '{' { $$= newBegin( ) } - -RCURLY = '}' { $$= newEnd ( ) } - - -EQUAL = "==" { $$= newToken("==" ) } - -NOT_EQUAL = "!=" { $$= newToken("!=" ) } - -LTE = "<=" { $$= newToken("<=" ) } - -LT = "<" !'=' { $$= newToken("<" ) } - -GTE = ">=" { $$= newToken(">=" ) } - -GT = ">" !'=' { $$= newToken(">" ) } - - -DIV = '/' ![=*] { $$= newToken("/" ) } - -DIV_ASSIGN = "/=" { $$= newToken("/=" ) } - -PLUS = '+' ![+=] { $$= newToken("+" ) } - -PLUS_ASSIGN = "+=" { $$= newToken("+=" ) } - -INC = "++" { $$= newToken("++" ) } - -MINUS = '-' ![-=] { $$= newToken("-" ) } - -MINUS_ASSIGN = "-=" { $$= newToken("-=" ) } - -DEC = "--" { $$= newToken("--" ) } - -STAR = '*' !'=' { $$= newToken("*" ) } - -STAR_ASSIGN = "*=" { $$= newToken("*=" ) } - -MOD = '%' !'=' { $$= newToken("%" ) } - -MOD_ASSIGN = "%=" { $$= newToken("%=" ) } - -RSHIFT = ">>" !'=' { $$= newToken(">>" ) } - -RSHIFT_ASSIGN = ">>=" { $$= newToken(">>=" ) } - -LSHIFT = "<<" !'=' { $$= newToken("<<" ) } - -LSHIFT_ASSIGN = "<<=" { $$= newToken("<<=" ) } - - -LAND = "&&" { $$= newToken("&&" ) } - -LNOT = '!' !'=' { $$= newToken("!" ) } - -LOR = "||" { $$= newToken("||" ) } - - -BAND = '&' ![&=] { $$= newToken("&" ) } - -BAND_ASSIGN = "&=" { $$= newToken("&=" ) } - -BNOT = '~' { $$= newToken("~" ) } - -BOR = '|' ![|=] { $$= newToken("|" ) } - -BOR_ASSIGN = "|=" { $$= newToken("|=" ) } - -BXOR = '^' !'=' { $$= newToken("^" ) } - -BXOR_ASSIGN = "^=" { $$= newToken("^=" ) } - - -ALIGNOF = '__alignof__' !IDREST { $$= newToken("__alignof__" ) } - - | '__alignof' !IDREST { $$= newToken("__alignof" ) } - - -ASM = 'asm' !IDREST { $$= newToken("asm" ) } - - | '__asm' !IDREST { $$= newToken("__asm" ) } - - | '__asm__' !IDREST { $$= newToken("__asm__" ) } - - -ATTRIBUTE = '__attribute__' !IDREST { $$= newToken("__attribute__") } - -AUTO = 'auto' !IDREST { $$= newToken("auto" ) } - -BOOL = '_Bool' !IDREST { $$= newToken("_Bool" ) } - -BREAK = 'break' !IDREST { $$= newToken("break" ) } - -CASE = 'case' !IDREST { $$= newToken("case" ) } - -CHAR = 'char' !IDREST { $$= newToken("char" ) } - -COMPLEX = '_Complex' !IDREST { $$= newToken("_Complex" ) } - - | '__complex__' !IDREST &{gnu} { $$= newToken("__complex__" ) } - -CONST = 'const' !IDREST { $$= newToken("const" ) } - - | '__const' !IDREST { $$= newToken("__const" ) } - -CONTINUE = 'continue' !IDREST { $$= newToken("continue" ) } - -DEFAULT = 'default' !IDREST { $$= newToken("default" ) } - -DO = 'do' !IDREST { $$= newToken("do" ) } - -DOUBLE = 'double' !IDREST { $$= newToken("double" ) } - -ELSE = 'else' !IDREST { $$= newToken("else" ) } - -ENUM = 'enum' !IDREST { $$= newToken("enum" ) } - -EXTERN = 'extern' !IDREST { $$= newToken("extern" ) } - -FLOAT = 'float' !IDREST { $$= newToken("float" ) } - -FOR = 'for' !IDREST { $$= newToken("for" ) } - -GOTO = 'goto' !IDREST { $$= newToken("goto" ) } - -IF = 'if' !IDREST { $$= newToken("if" ) } - -INLINE = 'inline' !IDREST { $$= newToken("inline" ) } - - | '__inline__' !IDREST &{gnu} { $$= newToken("__inline__" ) } - -INT = 'int' !IDREST { $$= newToken("int" ) } - -LONG = 'long' !IDREST { $$= newToken("long" ) } - -REGISTER = 'register' !IDREST { $$= newToken("register" ) } - -RESTRICT = 'restrict' !IDREST { $$= newToken("restrict" ) } - -RETURN = 'return' !IDREST { $$= newToken("return" ) } - -SHORT = 'short' !IDREST { $$= newToken("short" ) } - -SIGNED = 'signed' !IDREST { $$= newToken("signed" ) } - -SIZEOF = 'sizeof' !IDREST { $$= newToken("sizeof" ) } - -STATIC = 'static' !IDREST { $$= newToken("static" ) } - -STRUCT = 'struct' !IDREST { $$= newToken("struct" ) } - -SWITCH = 'switch' !IDREST { $$= newToken("switch" ) } - -TYPEDEF = 'typedef' !IDREST { $$= newToken("typedef" ) } - -TYPEOF = 'typeof' !IDREST { $$= newToken("typeof" ) } - - | '__typeof__' !IDREST { $$= newToken("__typeof__" ) } - -UNION = 'union' !IDREST { $$= newToken("union" ) } - -UNSIGNED = 'unsigned' !IDREST { $$= newToken("unsigned" ) } - -VOID = 'void' !IDREST { $$= newToken("void" ) } - -VOLATILE = 'volatile' !IDREST { $$= newToken("volatile" ) } - -WHILE = 'while' !IDREST { $$= newToken("while" ) } - - -IMAG = '__imag__' !IDREST &{gnu} { $$= newToken("__imag__" ) } - -LABEL = '__label__' !IDREST &{gnu} { $$= newToken("__label__") } - -REAL = '__real__' !IDREST &{gnu} { $$= newToken("__real__" ) } - - -BUILTIN_VA_LIST = '__builtin_va_list' !IDREST &{gnu} { $$= newToken("__builtin_va_list" ) } - -__RESTRICT = '__restrict' !IDREST &{gnu} { $$= newToken("__restrict" ) } - -__INLINE = '__inline' !IDREST &{gnu} { $$= newToken("__inline" ) } - -_FLOAT128 = '_Float128' !IDREST &{gnu} { $$= newToken("_Float128" ) } - +ASSIGN = '=' !'=' { $$= newToken("=" ) } - +COLON = ':' { $$= newToken(":" ) } - +COMMA = ',' { $$= newToken("," ) } - +QUESTION = '?' { $$= newToken("?" ) } - +SEMI = ';' { $$= newToken(";" ) } - + +PTR = "->" { $$= newToken("->" ) } - + +DOT = '.' !'.' { $$= newToken("." ) } - +ELLIPSIS = '...' { $$= newToken("..." ) } - + +LPAREN = '(' { $$= newToken("(" ) } - +RPAREN = ')' { $$= newToken(")" ) } - +LBRACKET = '[' { $$= newToken("[" ) } - +RBRACKET = ']' { $$= newToken("]" ) } - +LCURLY = '{' { $$= newBegin( ) } - +RCURLY = '}' { $$= newEnd ( ) } - + +EQUAL = "==" { $$= newToken("==" ) } - +NOT_EQUAL = "!=" { $$= newToken("!=" ) } - +LTE = "<=" { $$= newToken("<=" ) } - +LT = "<" !'=' { $$= newToken("<" ) } - +GTE = ">=" { $$= newToken(">=" ) } - +GT = ">" !'=' { $$= newToken(">" ) } - + +DIV = '/' ![=*] { $$= newToken("/" ) } - +DIV_ASSIGN = "/=" { $$= newToken("/=" ) } - +PLUS = '+' ![+=] { $$= newToken("+" ) } - +PLUS_ASSIGN = "+=" { $$= newToken("+=" ) } - +INC = "++" { $$= newToken("++" ) } - +MINUS = '-' ![-=] { $$= newToken("-" ) } - +MINUS_ASSIGN = "-=" { $$= newToken("-=" ) } - +DEC = "--" { $$= newToken("--" ) } - +STAR = '*' !'=' { $$= newToken("*" ) } - +STAR_ASSIGN = "*=" { $$= newToken("*=" ) } - +MOD = '%' !'=' { $$= newToken("%" ) } - +MOD_ASSIGN = "%=" { $$= newToken("%=" ) } - +RSHIFT = ">>" !'=' { $$= newToken(">>" ) } - +RSHIFT_ASSIGN = ">>=" { $$= newToken(">>=" ) } - +LSHIFT = "<<" !'=' { $$= newToken("<<" ) } - +LSHIFT_ASSIGN = "<<=" { $$= newToken("<<=" ) } - + +LAND = "&&" { $$= newToken("&&" ) } - +LNOT = '!' !'=' { $$= newToken("!" ) } - +LOR = "||" { $$= newToken("||" ) } - + +BAND = '&' ![&=] { $$= newToken("&" ) } - +BAND_ASSIGN = "&=" { $$= newToken("&=" ) } - +BNOT = '~' { $$= newToken("~" ) } - +BOR = '|' ![|=] { $$= newToken("|" ) } - +BOR_ASSIGN = "|=" { $$= newToken("|=" ) } - +BXOR = '^' !'=' { $$= newToken("^" ) } - +BXOR_ASSIGN = "^=" { $$= newToken("^=" ) } - + +ALIGNOF = '__alignof__' !IDREST { $$= newToken("__alignof__" ) } - + | '__alignof' !IDREST { $$= newToken("__alignof" ) } - + +ASM = 'asm' !IDREST { $$= newToken("asm" ) } - + | '__asm' !IDREST { $$= newToken("__asm" ) } - + | '__asm__' !IDREST { $$= newToken("__asm__" ) } - + +ATTRIBUTE = '__attribute__' !IDREST { $$= newToken("__attribute__" ) } - +AUTO = 'auto' !IDREST { $$= newToken("auto" ) } - +BOOL = '_Bool' !IDREST { $$= newToken("_Bool" ) } - +BREAK = 'break' !IDREST { $$= newToken("break" ) } - +CASE = 'case' !IDREST { $$= newToken("case" ) } - +CHAR = 'char' !IDREST { $$= newToken("char" ) } - +COMPLEX = '_Complex' !IDREST { $$= newToken("_Complex" ) } - + | '__complex__' !IDREST &{gnu} { $$= newToken("__complex__" ) } - +CONST = 'const' !IDREST { $$= newToken("const" ) } - + | '__const' !IDREST { $$= newToken("__const" ) } - +CONTINUE = 'continue' !IDREST { $$= newToken("continue" ) } - +DEFAULT = 'default' !IDREST { $$= newToken("default" ) } - +DO = 'do' !IDREST { $$= newToken("do" ) } - +DOUBLE = 'double' !IDREST { $$= newToken("double" ) } - +ELSE = 'else' !IDREST { $$= newToken("else" ) } - +ENUM = 'enum' !IDREST { $$= newToken("enum" ) } - +EXTERN = 'extern' !IDREST { $$= newToken("extern" ) } - +FLOAT = 'float' !IDREST { $$= newToken("float" ) } - +FOR = 'for' !IDREST { $$= newToken("for" ) } - +GOTO = 'goto' !IDREST { $$= newToken("goto" ) } - +IF = 'if' !IDREST { $$= newToken("if" ) } - +INLINE = 'inline' !IDREST { $$= newToken("inline" ) } - + | '__inline__' !IDREST &{gnu} { $$= newToken("__inline__" ) } - +INT = 'int' !IDREST { $$= newToken("int" ) } - +LONG = 'long' !IDREST { $$= newToken("long" ) } - +REGISTER = 'register' !IDREST { $$= newToken("register" ) } - +RESTRICT = 'restrict' !IDREST { $$= newToken("restrict" ) } - +RETURN = 'return' !IDREST { $$= newToken("return" ) } - +SHORT = 'short' !IDREST { $$= newToken("short" ) } - +SIGNED = 'signed' !IDREST { $$= newToken("signed" ) } - +SIZEOF = 'sizeof' !IDREST { $$= newToken("sizeof" ) } - +STATIC = 'static' !IDREST { $$= newToken("static" ) } - +STRUCT = 'struct' !IDREST { $$= newToken("struct" ) } - +SWITCH = 'switch' !IDREST { $$= newToken("switch" ) } - +TYPEDEF = 'typedef' !IDREST { $$= newToken("typedef" ) } - +TYPEOF = 'typeof' !IDREST { $$= newToken("typeof" ) } - + | '__typeof__' !IDREST { $$= newToken("__typeof__" ) } - +UNION = 'union' !IDREST { $$= newToken("union" ) } - +UNSIGNED = 'unsigned' !IDREST { $$= newToken("unsigned" ) } - +VOID = 'void' !IDREST { $$= newToken("void" ) } - +VOLATILE = 'volatile' !IDREST { $$= newToken("volatile" ) } - +WHILE = 'while' !IDREST { $$= newToken("while" ) } - + +IMAG = '__imag__' !IDREST &{gnu} { $$= newToken("__imag__" ) } - +LABEL = '__label__' !IDREST &{gnu} { $$= newToken("__label__" ) } - +REAL = '__real__' !IDREST &{gnu} { $$= newToken("__real__" ) } - + +BUILTIN_VA_LIST = '__builtin_va_list' !IDREST &{gnu} { $$= newToken("__builtin_va_list" ) } - +__RESTRICT = '__restrict' !IDREST &{gnu} { $$= newToken("__restrict" ) } - +__INLINE = '__inline' !IDREST &{gnu} { $$= newToken("__inline" ) } - +_FLOAT128 = '_Float128' !IDREST &{gnu} { $$= newToken("_Float128" ) } - #--------------------------------------------- Meta grammar ----------------------------------------------# # the semicolon has to be explicit with no space eaten afterwards to prevent the # input buffer from moving past it before redirecting input from the imported file -metaCatch = META_AT ( META_IMPORT s:META_STRING ";" { inputStackPush(get(s, String, value)) ; $$ = 0 } - | m:mvalue { $$ = m } - | META_LCB s:mstmts { map_append(outputProgram, s); $$ = null } +metaCatch = META_AT ( META_IMPORT s:META_STRING ";" { inputStackPush(get(s, String, value)) ; $$= 0 } + | m:mvalue { $$= m } + | META_LCB s:mstmts { map_append(outputProgram, s); $$= null } ) -mvalue = i:META_IDENT { $$ = eval(globals, newGetVariable(i)) } +mvalue = i:META_IDENT { $$= eval(globals, newGetVariable(i)) } | META_LPAREN ( i:MO_OPERATION #| i:meta_block usefull ? | i:meta_exp - ) META_RPAREN { $$ = eval(globals, i) } + ) META_RPAREN { $$= eval(globals, i) } -mstmts = ( s:eval_stmt )* ( META_NIL META_SEMICOLON META_RCB { $$ = null } - | META_RCB { $$ = s } +mstmts = ( s:eval_stmt )* ( META_NIL META_SEMICOLON META_RCB { $$= null } + | META_RCB { $$= s } ) -eval_stmt = s:meta_stmt { $$ = eval(globals, s) } - -meta_stmt = s:meta_block { $$ = s } - | META_SEMICOLON { $$ = null } - | l:META_IDENT p:meta_paramList e:meta_block { $$ = newFunc(l, p, e, null) } - | META_IF META_LPAREN c:meta_exp META_RPAREN t:meta_stmt META_ELSE f:meta_stmt { $$ = newIf(c, t, f ) } - | META_IF META_LPAREN c:meta_exp META_RPAREN t:meta_stmt { $$ = newIf(c, t, null) } - | META_WHILE META_LPAREN c:meta_exp META_RPAREN s:meta_stmt { $$ = newWhile(c, s) } - | META_DO s:meta_stmt META_WHILE META_LPAREN c:meta_exp META_RPAREN { $$ = newDo(s, c) } - | META_FOR META_LPAREN i:meta_ident META_IN e:meta_exp META_RPAREN s:meta_stmt { $$ = newForIn(i, e, s) } - | META_FOR META_LPAREN i:meta_stmt c:meta_stmt u:meta_exp META_RPAREN s:meta_stmt { $$ = newFor(i, c, u, s) } - | s:meta_switch { $$ = s } - | META_RETURN e:meta_exp { $$ = newReturn(e) } - | META_RETURN { $$ = newReturn(null) } - | META_BREAK { $$ = newBreak() } - | META_CONTINUE { $$ = newContinue() } - | META_THROW e:meta_exp { $$ = newUnary(Throw_proto, e) } - | t:meta_try { $$ = t } - | e:meta_exp META_SEMICOLON { $$ = e } +eval_stmt = s:meta_stmt { $$= eval(globals, s) } + +meta_stmt = s:meta_block { $$= s } + | META_SEMICOLON { $$= null } + | l:META_IDENT p:meta_paramList e:meta_block { $$= newFunc(l, p, e, null) } + | META_IF META_LPAREN c:meta_exp META_RPAREN t:meta_stmt META_ELSE f:meta_stmt { $$= newIf(c, t, f ) } + | META_IF META_LPAREN c:meta_exp META_RPAREN t:meta_stmt { $$= newIf(c, t, null) } + | META_WHILE META_LPAREN c:meta_exp META_RPAREN s:meta_stmt { $$= newWhile(c, s) } + | META_DO s:meta_stmt META_WHILE META_LPAREN c:meta_exp META_RPAREN { $$= newDo(s, c) } + | META_FOR META_LPAREN i:meta_ident META_IN e:meta_exp META_RPAREN s:meta_stmt { $$= newForIn(i, e, s) } + | META_FOR META_LPAREN i:meta_stmt c:meta_stmt u:meta_exp META_RPAREN s:meta_stmt { $$= newFor(i, c, u, s) } + | s:meta_switch { $$= s } + | META_RETURN e:meta_exp { $$= newReturn(e) } + | META_RETURN { $$= newReturn(null) } + | META_BREAK { $$= newBreak() } + | META_CONTINUE { $$= newContinue() } + | META_THROW e:meta_exp { $$= newUnary(Throw_proto, e) } + | t:meta_try { $$= t } + | e:meta_exp META_SEMICOLON { $$= e } meta_block = META_LCB m:meta_makeMap ( s:meta_stmt { map_append(m, s) } ) * ( s:meta_exp { map_append(m, s) } ) ? - META_RCB { $$ = newBlock(m) } - -meta_exp = META_VAR l:meta_ident META_ASSIGN e:meta_exp { $$ = newDeclaration(l, e) } -# | META_SYNTAX l:META_IDENT p:meta_paramList q:META_IDENT e:meta_block { $$ = (map_append(p, q), newFunc(l, p, e, makeInteger(2))) } -# | META_SYNTAX p:meta_paramList q:META_IDENT e:meta_block { $$ = (map_append(p, q), newFunc(null, p, e, makeInteger(2))) } -# | META_SYNTAX l:META_IDENT p:meta_paramList e:meta_block { $$ = newFunc(l, p, e, makeInteger(1)) } -# | META_SYNTAX p:meta_paramList e:meta_block { $$ = newFunc(null, p, e, makeInteger(1)) } - | l:META_IDENT o:meta_assignOp e:meta_exp { $$ = newAssign(Assign_proto, l, o, e) } - | l:meta_postfix META_DOT i:META_IDENT o:meta_assignOp e:meta_exp { $$ = newSetMap(SetMember_proto, l, i, o, e) } - | l:meta_postfix META_LBRAC i:meta_exp META_RBRAC o:meta_assignOp e:meta_exp { $$ = newSetMap(SetIndex_proto, l, i, o, e) } - | l:meta_syntax2 a:meta_argumentList s:meta_block { $$ = (map_append(a, s), apply(globals, globals, l, a, a)) } - | c:meta_cond { $$ = c } - - -meta_ident = l:META_IDENT { $$ = l } -# | META_AT n:meta_prefix { $$ = newUnary(Unquote_proto, n) } + META_RCB { $$= newBlock(m) } + +meta_exp = META_VAR l:meta_ident META_ASSIGN e:meta_exp { $$= newDeclaration(l, e) } +# | META_SYNTAX l:META_IDENT p:meta_paramList q:META_IDENT e:meta_block { $$= (map_append(p, q), newFunc(l, p, e, makeInteger(2))) } +# | META_SYNTAX p:meta_paramList q:META_IDENT e:meta_block { $$= (map_append(p, q), newFunc(null, p, e, makeInteger(2))) } +# | META_SYNTAX l:META_IDENT p:meta_paramList e:meta_block { $$= newFunc(l, p, e, makeInteger(1)) } +# | META_SYNTAX p:meta_paramList e:meta_block { $$= newFunc(null, p, e, makeInteger(1)) } + | l:META_IDENT o:meta_assignOp e:meta_exp { $$= newAssign(Assign_proto, l, o, e) } + | l:meta_postfix META_DOT i:META_IDENT o:meta_assignOp e:meta_exp { $$= newSetMap(SetMember_proto, l, i, o, e) } + | l:meta_postfix META_LBRAC i:meta_exp META_RBRAC o:meta_assignOp e:meta_exp { $$= newSetMap(SetIndex_proto, l, i, o, e) } + | l:meta_syntax2 a:meta_argumentList s:meta_block { $$= (map_append(a, s), apply(globals, globals, l, a, a)) } + | c:meta_cond { $$= c } + +meta_ident = l:META_IDENT { $$= l } +# | META_AT n:meta_prefix { $$= newUnary(Unquote_proto, n) } meta_syntax2 = < [a-zA-Z_][a-zA-Z0-9_]* > - &{ null != getSyntaxId(2, intern(yytext)) } -- { $$ = getSyntaxId(2, intern(yytext)) } + &{ null != getSyntaxId(2, intern(yytext)) } -- { $$= getSyntaxId(2, intern(yytext)) } meta_try = META_TRY t:meta_stmt i:meta_null c:meta_null f:meta_null ( META_CATCH META_LPAREN i:META_IDENT META_RPAREN c:meta_stmt ) ? - ( META_FINALLY f:meta_stmt ) ? { $$ = newTry(t, i, c, f) } + ( META_FINALLY f:meta_stmt ) ? { $$= newTry(t, i, c, f) } -meta_null = { $$ = null } +meta_null = { $$= null } meta_assignOp = META_ASSIGN { $$= null } | META_ASSIGNADD { $$= Add_symbol } @@ -2250,56 +2249,56 @@ meta_switch = META_SWITCH META_LPAREN e:meta_exp META_RPAREN )* META_RCB { $$= newSwitch(e, labels, statements) } -meta_cond = c:meta_logor META_QUERY t:meta_exp META_COLON f:meta_cond { $$ = newIf(c, t, f) } +meta_cond = c:meta_logor META_QUERY t:meta_exp META_COLON f:meta_cond { $$= newIf(c, t, f) } | meta_logor meta_logor = l:meta_logand ( META_LOGOR r:meta_logand { l = newBinary(Logor_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_logand = l:meta_bitor ( META_LOGAND r:meta_bitor { l = newBinary(Logand_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_bitor = l:meta_bitxor ( META_BITOR r:meta_bitxor { l = newBinary(Bitor_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_bitxor = l:meta_bitand ( META_BITXOR r:meta_bitand { l = newBinary(Bitxor_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_bitand = l:meta_eq ( META_BITAND r:meta_eq { l = newBinary(Bitand_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_eq = l:meta_ineq ( META_EQUAL r:meta_ineq { l = newBinary(Equal_proto, l, r) } | META_NOTEQ r:meta_ineq { l = newBinary(Noteq_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_ineq = l:meta_shift ( META_LESS r:meta_shift { l = newBinary(Less_proto, l, r) } | META_LESSEQ r:meta_shift { l = newBinary(Lesseq_proto, l, r) } | META_GREATEREQ r:meta_shift { l = newBinary(Greatereq_proto, l, r) } | META_GREATER r:meta_shift { l = newBinary(Greater_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_shift = l:meta_sum ( META_SHLEFT r:meta_sum { l = newBinary(Shleft_proto, l, r) } | META_SHRIGHT r:meta_sum { l = newBinary(Shright_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_sum = l:meta_prod ( META_PLUS r:meta_prod { l = newBinary(Add_proto, l, r) } | META_MINUS r:meta_prod { l = newBinary(Sub_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_prod = l:meta_prefix ( META_MULTI r:meta_prefix { l = newBinary(Mul_proto, l, r) } | META_DIVIDE r:meta_prefix { l = newBinary(Div_proto, l, r) } | META_MODULO r:meta_prefix { l = newBinary(Mod_proto, l, r) } - )* { $$ = l } + )* { $$= l } meta_prefix = META_PLUS n:meta_prefix { $$= n } | META_NEGATE n:meta_prefix { $$= newUnary(Neg_proto, n) } @@ -2308,8 +2307,8 @@ meta_prefix = META_PLUS n:meta_prefix { $$= n } | META_PLUSPLUS n:meta_prefix { $$= newPreIncrement(n) } | META_MINUSMINUS n:meta_prefix { $$= newPreDecrement(n) } | m:MO_OPERATION { $$= m } -# | META_BACKTICK n:meta_prefix { $$ = newUnary(Quasiquote_proto, n) } -# | META_AT n:meta_prefix { $$ = newUnary(Unquote_proto, n) } +# | META_BACKTICK n:meta_prefix { $$= newUnary(Quasiquote_proto, n) } +# | META_AT n:meta_prefix { $$= newUnary(Unquote_proto, n) } | n:meta_postfix { $$= n } meta_postfix = i:meta_value @@ -2319,7 +2318,7 @@ meta_postfix = i:meta_value | a:meta_argumentList { i = (null != getSyntax(1, i)) ? apply(globals, globals, getSyntax(1, i), a, i) : newCall(i, a) } | META_PLUSPLUS { i = newPostIncrement(i) } | META_MINUSMINUS { i = newPostDecrement(i) } - ) * { $$ = i } + ) * { $$= i } meta_paramList = META_LPAREN m:meta_makeMap @@ -2327,36 +2326,36 @@ meta_paramList = META_LPAREN m:meta_makeMap ( META_COMMA i:META_IDENT { map_append(m, i) } ) * ) ? - META_RPAREN { $$ = m } + META_RPAREN { $$= m } meta_argumentList = META_LPAREN m:meta_makeMap ( e:meta_exp { map_append(m, e) } ( META_COMMA e:meta_exp { map_append(m, e) } ) * ) ? - META_RPAREN { $$ = m } + META_RPAREN { $$= m } -meta_value = n:META_FLOAT { $$ = newFloat(n) } - | n:meta_integer { $$ = newInteger(n) } - | s:meta_string { $$ = newString(s) } - | s:meta_symbol { $$ = s } - | m:meta_map { $$ = newMap(m) } - | META_NULL { $$ = null } - | i:META_IDENT { $$ = newGetVariable(i) } - | p:meta_paramList e:meta_block { $$ = newFunc(null, p, e, null) } - | META_LPAREN ( i:meta_block | i:meta_exp ) META_RPAREN { $$ = i } +meta_value = n:META_FLOAT { $$= newFloat(n) } + | n:meta_integer { $$= newInteger(n) } + | s:meta_string { $$= newString(s) } + | s:meta_symbol { $$= s } + | m:meta_map { $$= newMap(m) } + | META_NULL { $$= null } + | i:META_IDENT { $$= newGetVariable(i) } + | p:meta_paramList e:meta_block { $$= newFunc(null, p, e, null) } + | META_LPAREN ( i:meta_block | i:meta_exp ) META_RPAREN { $$= i } -meta_string = s:META_STRING -- { $$ = s } +meta_string = s:META_STRING -- { $$= s } -META_STRING = META_DQUOTE < (!META_DQUOTE meta_char)* > META_DQUOTE { $$ = makeString(unescape(yytext)) } +META_STRING = META_DQUOTE < (!META_DQUOTE meta_char)* > META_DQUOTE { $$= makeString(unescape(yytext)) } meta_char = '\\' . | . meta_symbol = META_HASH - ( i:META_IDENT { $$ = newSymbol(i) } - | i:meta_string { $$ = newSymbol(intern(get(i, String, value))) } + ( i:META_IDENT { $$= newSymbol(i) } + | i:meta_string { $$= newSymbol(intern(get(i, String, value))) } ) meta_map = META_LCB m:meta_makeMap @@ -2364,15 +2363,15 @@ meta_map = META_LCB m:meta_makeMap ( META_COMMA k:meta_key META_COLON v:meta_exp { map_set(m, k, v) } ) * ) ? - META_RCB { $$ = m } + META_RCB { $$= m } | META_LBRAC m:meta_makeMap ( v:meta_exp { map_append(m, v) } ( META_COMMA v:meta_exp { map_append(m, v) } ) * ) ? - META_RBRAC { $$ = m } + META_RBRAC { $$= m } -meta_makeMap = { $$ = makeMap() } +meta_makeMap = { $$= makeMap() } meta_key = META_IDENT | meta_integer @@ -2380,33 +2379,31 @@ meta_keyword = META_SWITCH | META_CASE | META_DEFAULT | META_DO | META_FOR | ME | META_THROW | META_TRY | META_CATCH | META_FINALLY | META_NIL # | META_SYNTAX -META_IDENT = !meta_keyword < [a-zA-Z_][a-zA-Z0-9_]* > -- { $$ = intern(yytext) } +META_IDENT = !meta_keyword < [a-zA-Z_][a-zA-Z0-9_]* > -- { $$= intern(yytext) } -meta_integer = i:META_INTEGER { $$ = i } - | '-' i:meta_integer { $$ = makeInteger(-getInteger(i)) } +meta_integer = i:META_INTEGER { $$= i } + | '-' i:meta_integer { $$= makeInteger(-getInteger(i)) } -META_INTEGER = '0b' < [01]+ > { $$ = makeInteger(strtol(yytext, 0, 2)) } -- - | '0x' < [0-9a-fA-F]+ > { $$ = makeInteger(strtol(yytext, 0, 16)) }-- - | '0' < [0-7]+ > { $$ = makeInteger(strtol(yytext, 0, 8)) }-- - | < [0-9]+ > { $$ = makeInteger(strtol(yytext, 0, 10)) }-- - | META_SQUOTE < (!META_SQUOTE meta_char) > META_SQUOTE { $$ = makeInteger(unescape(yytext)[0]) }-- +META_INTEGER = '0b' < [01]+ > { $$= makeInteger(strtol(yytext, 0, 2)) } -- + | '0x' < [0-9a-fA-F]+ > { $$= makeInteger(strtol(yytext, 0, 16)) }-- + | '0' < [0-7]+ > { $$= makeInteger(strtol(yytext, 0, 8)) }-- + | < [0-9]+ > { $$= makeInteger(strtol(yytext, 0, 10)) }-- + | META_SQUOTE < (!META_SQUOTE meta_char) > META_SQUOTE { $$= makeInteger(unescape(yytext)[0]) }-- -META_FLOAT = < [-+]* [0-9]+ '.' [0-9]* ('e'[-+]*[0-9]+)? > { $$ = makeFloat(strtold(yytext, 0)) } -- - | < [-+]* [0-9]* '.' [0-9]+ ('e'[-+]*[0-9]+)? > { $$ = makeFloat(strtold(yytext, 0)) } -- - | < [-+]* [0-9]+ ('e'[-+]*[0-9]+) > { $$ = makeFloat(strtold(yytext, 0)) } -- +META_FLOAT = < [-+]* [0-9]+ '.' [0-9]* ('e'[-+]*[0-9]+)? > { $$= makeFloat(strtold(yytext, 0)) } -- + | < [-+]* [0-9]* '.' [0-9]+ ('e'[-+]*[0-9]+)? > { $$= makeFloat(strtold(yytext, 0)) } -- + | < [-+]* [0-9]+ ('e'[-+]*[0-9]+) > { $$= makeFloat(strtold(yytext, 0)) } -- -###### META operators ###### +#--------------------------------------------- Meta operator ----------------------------------------------# -MO_OPERATION = META_BACKTICK ( MO_INITIALIZER i:initializer { $$ = newUnary(Quote_proto ,i) } - | MO_CONSTANT c:constant { $$ = newUnary(Quote_proto ,c) } - | MO_STATEMENT c:statement { $$ = newUnary(Quote_proto ,c) } - | MO_INTEGER i:integerConstant { $$ = newUnary(Quote_proto ,i) } - | MO_DECLARATION i:declaration { $$ = newUnary(Quote_proto ,i) } - | MO_STRING i:stringLiteral { $$ = newUnary(Quote_proto ,i) } +MO_OPERATION = META_BACKTICK ( MO_INITIALIZER i:initializer { $$= newUnary(Quote_proto ,i) } + | MO_CONSTANT c:constant { $$= newUnary(Quote_proto ,c) } + | MO_STATEMENT c:statement { $$= newUnary(Quote_proto ,c) } + | MO_INTEGER i:integerConstant { $$= newUnary(Quote_proto ,i) } + | MO_DECLARATION i:declaration { $$= newUnary(Quote_proto ,i) } + | MO_STRING i:stringLiteral { $$= newUnary(Quote_proto ,i) } ) -# META_OPERATORS = MO_INITIALIZER | MO_CONSTANT | MO_STATEMENT | MO_INTEGER | MO_DECLARATION | MO_STRING - MO_INITIALIZER = 'initializer' ![(a-zA-Z0-9_] -- MO_CONSTANT = 'constant' ![(a-zA-Z0-9_] -- MO_STATEMENT = 'statement' ![(a-zA-Z0-9_] -- @@ -2415,7 +2412,7 @@ MO_DECLARATION = 'declaration' ![(a-zA-Z0-9_] -- MO_STRING = 'string' ![(a-zA-Z0-9_] -- -############################ +#--------------------------------------------- Meta rules ----------------------------------------------# META_NIL = 'nil' ![a-zA-Z0-9_] -- #META_FUN = 'fun' ![a-zA-Z0-9_] -- @@ -2490,37 +2487,37 @@ META_RPAREN = ')' -- META_DQUOTE = '"' META_SQUOTE = "'" -#--------------------------------------------- Common rules ----------------------------------------------# +#-------------------- C space rules --------------------# + +- = < Space* > { if (yyleng && $$) setComment($$, newComment(yytext)) } --- = (blank | comment)* +Space = Blank | Comment | EOL | Directive + | "__extension__" &{gnu} { icol += 13 } -- = < Space* > { if (yyleng && $$) setComment($$, newComment(yytext)) } +Blank = ( [\003-\010] | '\013' | '\f' | [\016-\037] | [\177-\377] | ' ' ) { ++icol } + | '\t' { icol= (icol + 8) & ~7 } -#| C rules -Space = Blank | Comment | EOL | Directive - | "__extension__" &{gnu} { icol += 13 } +EOL = ( "\r\n" | '\n' | '\r' ) { ++irow; icol= 0 } -Blank = ( [\003-\010] | '\013' | '\f' | [\016-\037] | [\177-\377] | ' ' ) { ++icol } - | '\t' { icol= (icol + 8) & ~7 } +Comment = "/*" ( !"*/" (EOL | Any) )* "*/" + | "//" ( ![\n\r] Any )* EOL -EOL = ( "\r\n" | '\n' | '\r' ) { ++irow; icol= 0 } +Directive = "#" (!EOL .)* -Comment = "/*" ( !"*/" (EOL | Any) )* "*/" - | "//" ( ![\n\r] Any )* EOL +Any = . { ++icol } -Directive = "#" (!EOL .)* +#-------------------- Meta space rules --------------------# -Any = . { ++icol } +-- = (blank | comment)* -#| Meta rules -blank = space | eol -space = [ \t] -eol = ( "\n""\r"* - | "\r""\n"* - ) { inputStack->lineNumber++ } +blank = space | eol +space = [ \t] +eol = ( "\n""\r"* + | "\r""\n"* + ) { inputStack->lineNumber++ } -comment = "//" ( ![\n\r] . )* - | "/*" ( !"*/" (eol | .) )* "*/" +comment = "//" ( ![\n\r] . )* + | "/*" ( !"*/" (eol | .) )* "*/" %% ; @@ -4722,4 +4719,4 @@ int main(int argc, char **argv) // Local Variables: // indent-tabs-mode: nil -// End: \ No newline at end of file +// End:- \ No newline at end of file