diff options
Diffstat (limited to '')
| -rw-r--r-- | lparser.c | 30 |
1 files changed, 13 insertions, 17 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 1.73 2000/03/24 17:26:08 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.74 2000/03/29 20:19:20 roberto Exp roberto $ |
| 3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -901,17 +901,16 @@ static int funcname (LexState *ls, expdesc *v) { | |||
| 901 | } | 901 | } |
| 902 | 902 | ||
| 903 | 903 | ||
| 904 | static int funcstat (LexState *ls, int line) { | 904 | static void funcstat (LexState *ls, int line) { |
| 905 | /* funcstat -> FUNCTION funcname body */ | 905 | /* funcstat -> FUNCTION funcname body */ |
| 906 | int needself; | 906 | int needself; |
| 907 | expdesc v; | 907 | expdesc v; |
| 908 | if (ls->fs->prev) /* inside other function? */ | 908 | if (ls->fs->prev) /* inside other function? */ |
| 909 | return 0; | 909 | luaK_error(ls, "cannot nest this kind of function declaration"); |
| 910 | setline_and_next(ls); /* skip FUNCTION */ | 910 | setline_and_next(ls); /* skip FUNCTION */ |
| 911 | needself = funcname(ls, &v); | 911 | needself = funcname(ls, &v); |
| 912 | body(ls, needself, line); | 912 | body(ls, needself, line); |
| 913 | luaK_storevar(ls, &v); | 913 | luaK_storevar(ls, &v); |
| 914 | return 1; | ||
| 915 | } | 914 | } |
| 916 | 915 | ||
| 917 | 916 | ||
| @@ -969,42 +968,39 @@ static int stat (LexState *ls) { | |||
| 969 | case TK_IF: /* stat -> IF ifpart END */ | 968 | case TK_IF: /* stat -> IF ifpart END */ |
| 970 | ifpart(ls); | 969 | ifpart(ls); |
| 971 | check_END(ls, TK_IF, line); | 970 | check_END(ls, TK_IF, line); |
| 972 | return 1; | 971 | break; |
| 973 | 972 | ||
| 974 | case TK_WHILE: /* stat -> whilestat */ | 973 | case TK_WHILE: /* stat -> whilestat */ |
| 975 | whilestat(ls, line); | 974 | whilestat(ls, line); |
| 976 | return 1; | 975 | break; |
| 977 | 976 | ||
| 978 | case TK_DO: { /* stat -> DO block END */ | 977 | case TK_DO: { /* stat -> DO block END */ |
| 979 | setline_and_next(ls); /* skip DO */ | 978 | setline_and_next(ls); /* skip DO */ |
| 980 | block(ls); | 979 | block(ls); |
| 981 | check_END(ls, TK_DO, line); | 980 | check_END(ls, TK_DO, line); |
| 982 | return 1; | 981 | break; |
| 983 | } | 982 | } |
| 984 | 983 | ||
| 985 | case TK_REPEAT: /* stat -> repeatstat */ | 984 | case TK_REPEAT: /* stat -> repeatstat */ |
| 986 | repeatstat(ls, line); | 985 | repeatstat(ls, line); |
| 987 | return 1; | 986 | break; |
| 988 | 987 | ||
| 989 | case TK_FUNCTION: /* stat -> funcstat */ | 988 | case TK_FUNCTION: /* stat -> funcstat */ |
| 990 | return funcstat(ls, line); | 989 | funcstat(ls, line); |
| 990 | break; | ||
| 991 | 991 | ||
| 992 | case TK_LOCAL: /* stat -> localstat */ | 992 | case TK_LOCAL: /* stat -> localstat */ |
| 993 | localstat(ls); | 993 | localstat(ls); |
| 994 | return 1; | 994 | break; |
| 995 | 995 | ||
| 996 | case TK_NAME: case '%': /* stat -> namestat */ | 996 | case TK_NAME: case '%': /* stat -> namestat */ |
| 997 | namestat(ls); | 997 | namestat(ls); |
| 998 | return 1; | 998 | break; |
| 999 | |||
| 1000 | case TK_RETURN: case TK_END: case TK_UNTIL: | ||
| 1001 | case ';': case TK_ELSE: case TK_ELSEIF: case TK_EOS: /* `stat' follow */ | ||
| 1002 | return 0; | ||
| 1003 | 999 | ||
| 1004 | default: | 1000 | default: |
| 1005 | error_unexpected(ls); | 1001 | return 0; /* no statement */ |
| 1006 | return 0; /* to avoid warnings */ | ||
| 1007 | } | 1002 | } |
| 1003 | return 1; | ||
| 1008 | } | 1004 | } |
| 1009 | 1005 | ||
| 1010 | 1006 | ||
