lang0/it2-out1.c
Johan B.W. de Vries 3112636825 Idea
2025-01-12 14:40:57 +01:00

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();
}