454 lines
9.2 KiB
C
454 lines
9.2 KiB
C
char * addstringchar(char * str, char * chr)
|
|
{
|
|
}
|
|
|
|
|
|
void increaseindent(char * var_indent)
|
|
{
|
|
char * var_indent = addstringchar(var_indent, " ");
|
|
char * var_indent = addstringchar(var_indent, " ");
|
|
char * var_indent = addstringchar(var_indent, " ");
|
|
char * var_indent = addstringchar(var_indent, " ");
|
|
return var_indent;
|
|
}
|
|
|
|
void lexident()
|
|
{
|
|
char * var_word = "";
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_isbeforea = lt(var_char, "a");
|
|
if (var_isbeforea)
|
|
{
|
|
break;
|
|
}
|
|
char * var_isafterz = lt("z", var_char);
|
|
if (var_isafterz)
|
|
{
|
|
break;
|
|
}
|
|
char * var_word = addstringchar(var_word, var_char);
|
|
skip();
|
|
}
|
|
return var_word;
|
|
}
|
|
|
|
void parseconststring()
|
|
{
|
|
skipchar(var_quote);
|
|
emit(var_quote);
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_iseof = eq(var_char, var_eof);
|
|
if (var_iseof)
|
|
{
|
|
break;
|
|
}
|
|
char * var_isquote = eq(var_char, var_quote);
|
|
if (var_isquote)
|
|
{
|
|
break;
|
|
}
|
|
emit(var_char);
|
|
skip();
|
|
}
|
|
skipchar(var_quote);
|
|
emit(var_quote);
|
|
}
|
|
|
|
void parseexprvarref()
|
|
{
|
|
char * var_varname = lexident();
|
|
emit("var_");
|
|
emit(var_varname);
|
|
}
|
|
|
|
void parseexprcall()
|
|
{
|
|
char * var_funcname = lexident();
|
|
emit(var_funcname);
|
|
emit("(");
|
|
char * var_first = "1";
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_isspace = eq(var_char, " ");
|
|
char * var_isnotspace = not(var_isspace);
|
|
if (var_isnotspace)
|
|
{
|
|
break;
|
|
}
|
|
skip();
|
|
char * var_isfirst = eq(var_first, "1");
|
|
char * var_isnotfirst = not(var_isfirst);
|
|
if (var_isnotfirst)
|
|
{
|
|
emit(", ");
|
|
}
|
|
char * var_char = peek();
|
|
char * var_isquote = eq(var_char, var_quote);
|
|
char * var_isnotquote = not(var_isquote);
|
|
if (var_isquote)
|
|
{
|
|
parseconststring();
|
|
}
|
|
if (var_isnotquote)
|
|
{
|
|
parseexprvarref();
|
|
}
|
|
char * var_first = "0";
|
|
}
|
|
emit(")");
|
|
}
|
|
|
|
void parsestatset(char * var_indent)
|
|
{
|
|
skipchar(" ");
|
|
char * var_var = lexident();
|
|
skipchar(" ");
|
|
emit(var_indent);
|
|
emit("char * var_");
|
|
emit(var_var);
|
|
emit(" = ");
|
|
parseconststring();
|
|
emit(";");
|
|
emit(var_eol);
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestatcalc(char * var_indent)
|
|
{
|
|
skipchar(" ");
|
|
char * var_var = lexident();
|
|
skipchar(" ");
|
|
emit(var_indent);
|
|
emit("char * var_");
|
|
emit(var_var);
|
|
emit(" = ");
|
|
parseexprcall();
|
|
emit(";");
|
|
emit(var_eol);
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestatif(char * var_indent)
|
|
{
|
|
skipchar(" ");
|
|
emit(var_indent);
|
|
emit("if (");
|
|
parseexprvarref();
|
|
emit(")\n");
|
|
emit(var_indent);
|
|
emit("{\n");
|
|
skipchar(var_eol);
|
|
char * var_indentt = increaseindent(var_indent);
|
|
parseblock(var_indentt);
|
|
emit(var_indent);
|
|
emit("}\n");
|
|
}
|
|
|
|
void parsestatforever(char * var_indent)
|
|
{
|
|
emit(var_indent);
|
|
emit("while (1)\n");
|
|
emit(var_indent);
|
|
emit("{\n");
|
|
skipchar(var_eol);
|
|
char * var_indentt = increaseindent(var_indent);
|
|
parseblock(var_indentt);
|
|
emit(var_indent);
|
|
emit("}\n");
|
|
}
|
|
|
|
void parsestatbreak(char * var_indent)
|
|
{
|
|
emit(var_indent);
|
|
emit("break;\n");
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestatreturn(char * var_indent)
|
|
{
|
|
emit(var_indent);
|
|
emit("return ");
|
|
char * var_char = peek();
|
|
char * var_isspace = eq(var_char, " ");
|
|
if (var_isspace)
|
|
{
|
|
skip();
|
|
parseexprvarref();
|
|
}
|
|
emit(";");
|
|
emit(var_eol);
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestatemit(char * var_indent)
|
|
{
|
|
emit(var_indent);
|
|
emit("emit(");
|
|
skipchar(" ");
|
|
char * var_char = peek();
|
|
char * var_isquote = eq(var_char, var_quote);
|
|
char * var_isnotquote = not(var_isquote);
|
|
if (var_isquote)
|
|
{
|
|
parseconststring();
|
|
}
|
|
if (var_isnotquote)
|
|
{
|
|
parseexprvarref();
|
|
}
|
|
emit(");\n");
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestattrace(char * var_indent)
|
|
{
|
|
emit(var_indent);
|
|
emit("trace(");
|
|
emit(var_quote);
|
|
skipchar(" ");
|
|
char * var_varname = lexident();
|
|
emit(var_varname);
|
|
emit(var_quote);
|
|
emit(", ");
|
|
emit(var_varname);
|
|
emit(")\n");
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestatskipchar(char * var_indent)
|
|
{
|
|
skipchar(" ");
|
|
emit(var_indent);
|
|
emit("skipchar(");
|
|
char * var_char = peek();
|
|
char * var_isquote = eq(var_char, var_quote);
|
|
char * var_isnotquote = not(var_isquote);
|
|
if (var_isquote)
|
|
{
|
|
parseconststring();
|
|
}
|
|
if (var_isnotquote)
|
|
{
|
|
parseexprvarref();
|
|
}
|
|
emit(");\n");
|
|
skipchar(var_eol);
|
|
}
|
|
|
|
void parsestat(char * var_indent)
|
|
{
|
|
char * var_call = lexident();
|
|
trace("call", call)
|
|
char * var_isset = eq(var_call, "set");
|
|
if (var_isset)
|
|
{
|
|
parsestatset(var_indent);
|
|
return ;
|
|
}
|
|
char * var_iscalc = eq(var_call, "calc");
|
|
if (var_iscalc)
|
|
{
|
|
parsestatcalc(var_indent);
|
|
return ;
|
|
}
|
|
char * var_isif = eq(var_call, "if");
|
|
if (var_isif)
|
|
{
|
|
parsestatif(var_indent);
|
|
return ;
|
|
}
|
|
char * var_isforever = eq(var_call, "forever");
|
|
if (var_isforever)
|
|
{
|
|
parsestatforever(var_indent);
|
|
return ;
|
|
}
|
|
char * var_isbreak = eq(var_call, "break");
|
|
if (var_isbreak)
|
|
{
|
|
parsestatbreak(var_indent);
|
|
return ;
|
|
}
|
|
char * var_isreturn = eq(var_call, "return");
|
|
if (var_isreturn)
|
|
{
|
|
parsestatreturn(var_indent);
|
|
return ;
|
|
}
|
|
char * var_isemit = eq(var_call, "emit");
|
|
if (var_isemit)
|
|
{
|
|
parsestatemit(var_indent);
|
|
return ;
|
|
}
|
|
char * var_istrace = eq(var_call, "trace");
|
|
if (var_istrace)
|
|
{
|
|
parsestattrace(var_indent);
|
|
return ;
|
|
}
|
|
char * var_isskipchar = eq(var_call, "skipchar");
|
|
if (var_isskipchar)
|
|
{
|
|
parsestatskipchar(var_indent);
|
|
return ;
|
|
}
|
|
emit(var_indent);
|
|
emit(var_call);
|
|
emit("(");
|
|
char * var_first = "1";
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_isspace = eq(var_char, " ");
|
|
char * var_isnotspace = not(var_isspace);
|
|
if (var_isnotspace)
|
|
{
|
|
break;
|
|
}
|
|
skip();
|
|
char * var_char = peek();
|
|
char * var_isquote = eq(var_char, var_quote);
|
|
char * var_isnotquote = not(var_isquote);
|
|
if (var_isquote)
|
|
{
|
|
parseconststring();
|
|
}
|
|
if (var_isnotquote)
|
|
{
|
|
parseexprvarref();
|
|
}
|
|
char * var_isfirst = eq(var_first, "1");
|
|
char * var_isnotfirst = not(var_isfirst);
|
|
if (var_isnotfirst)
|
|
{
|
|
emit(", ");
|
|
}
|
|
char * var_first = "0";
|
|
}
|
|
skipchar(var_eol);
|
|
emit(");\n");
|
|
}
|
|
|
|
void parseblock(char * var_indent)
|
|
{
|
|
while (1)
|
|
{
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_iseol = eq(var_char, var_eol);
|
|
char * var_isnoteol = not(var_iseol);
|
|
if (var_isnoteol)
|
|
{
|
|
break;
|
|
}
|
|
skip();
|
|
}
|
|
char * var_copy = " ";
|
|
while (1)
|
|
{
|
|
char * var_isdone = eq(var_copy, var_indent);
|
|
if (var_isdone)
|
|
{
|
|
break;
|
|
}
|
|
skipchar("\t");
|
|
char * var_copy = increaseindent(var_copy);
|
|
}
|
|
char * var_char = peek();
|
|
char * var_iseoblock = eq(var_char, "/");
|
|
if (var_iseoblock)
|
|
{
|
|
skip();
|
|
skipchar(var_eol);
|
|
break;
|
|
}
|
|
skipchar("\t");
|
|
parsestat(var_indent);
|
|
}
|
|
}
|
|
|
|
void parsefunc()
|
|
{
|
|
char * var_funcname = lexident();
|
|
trace("funcname", funcname)
|
|
emit("void ");
|
|
emit(var_funcname);
|
|
emit("(");
|
|
char * var_first = "1";
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_isspace = eq(var_char, " ");
|
|
char * var_isnotspace = not(var_isspace);
|
|
if (var_isnotspace)
|
|
{
|
|
break;
|
|
}
|
|
skip();
|
|
char * var_var = lexident();
|
|
char * var_isfirst = eq(var_first, "1");
|
|
char * var_isnotfirst = not(var_isfirst);
|
|
if (var_isnotfirst)
|
|
{
|
|
emit(", ");
|
|
}
|
|
emit("char * var_");
|
|
emit(var_var);
|
|
char * var_first = "0";
|
|
}
|
|
skipchar(":");
|
|
skipchar(var_eol);
|
|
emit(")\n{\n");
|
|
parseblock(" ");
|
|
emit("}\n\n");
|
|
}
|
|
|
|
void emitheader()
|
|
{
|
|
emit("char * addstringchar(char * str, char * chr)\n");
|
|
emit("{\n");
|
|
emit("}\n");
|
|
emit("\n");
|
|
emit("\n");
|
|
}
|
|
|
|
void emitfooter()
|
|
{
|
|
emit("");
|
|
}
|
|
|
|
void main()
|
|
{
|
|
emitheader();
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_iseof = eq(var_char, var_eof);
|
|
if (var_iseof)
|
|
{
|
|
break;
|
|
}
|
|
while (1)
|
|
{
|
|
char * var_char = peek();
|
|
char * var_iseol = eq(var_char, var_eol);
|
|
char * var_isnoteol = not(var_iseol);
|
|
if (var_isnoteol)
|
|
{
|
|
break;
|
|
}
|
|
skip();
|
|
}
|
|
parsefunc();
|
|
}
|
|
emitfooter();
|
|
}
|
|
|