Moin,
ich arbeite gerade daran einen Compiler für einen beliebigen Sprachsatz zu entwerfen.
Die Syntax wird dabei durch ein in den Parser geladenes Pattern nach EBNF ISO-Norm vorgegeben und die eigentlichen Programmbefehle kommen aus einer dynamisch gebundenen DLL.
Nun habe ich einen Performancetest gemacht und bin für:
function();
if(b==1)
{
i = 0;
while(i<10)
{
function(1);
add(i,1);
}
}
mit einem Muster
--compiler
if = "if(" {(([{" "}] basic.comparsion) [({" "} (basic.logicalLink) {" "})])} ")" [{" "}] "{" [{" "}] {([{" "}] statement [{" "}])} [{" "}]"}";
while = "while(" {(([{" "}] basic.comparsion) [({" "} (basic.logicalLink) {" "})])} ")" [{" "}] "{" [{" "}] {([{" "}] statement [{" "}])} [{" "}]"}";
statement = ((basic.assignment|basic.function) ";") | (if|while);
whitespace = " ";
--basic
comparsion = (function|identifier|number|string) [{" "}] ("=="|"!="|">="|"<="|">"|"<") [{" "}] (function|identifier|number|string);
assignment = identifier [{" "}] "=" [{" "}] (function|identifier|number|string);
function = identifier [{" "}] "(" ({(identifier [","])|(number [","])|(string [","])}) ")";
identifier = char - numeral - " " { ( char - " "|numeral ) };
string = ("'" {char} "'")|('"' {char} '"');
number = ["-"] {numeral};
char = "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|
"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|
"q"|"r"|"s"|"t"|"u"|"v"|"w"|"x"|
"y"|"z"|" "|numeral;
numeral = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|
"8"|"9";
logicalLink = (([{" "}] "&&" [{" "}]) | ([{" "}] "||" [{" "}]));
auf etwa 4 ms für das Parsen anhand der Token in der Gruppe "compiler" gekommen.
Ist das verhältnismäßig gut oder eher noch verbesserungswürdig?