Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mär 19, 2024 08:12

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
 Betreff des Beitrags: BTCI
BeitragVerfasst: Do Jul 04, 2013 09:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
halloechen allerseits,

ich habe Gestern mal einen Prototypen fuer einen Compiler Interpreter geschrieben. Das ganze funktioniert im Prinzip wie z.B. YACC nur das man halt seiner Syntax gleich noch sagt was ausgegeben werden soll. Waere schoen wenn ihr mir ein Feedback geben koenntet bevor ich das ganze nach C portiere. Denkt aber bitte daran es nur ein Prototyp ist und daher etwas dirty :P
(siehe Anhang fuer Quelltext)
Die Syntax-Dateien selbst sind eigentlich relativ simpel aufgebaut:

zuerst muessen alle Tokens definiert werden. Dies geschieht ueber die Anweisung %token gefolgt von einer Regex und einer Funktion fuer den Identifier. Beispiel:
Code:
  1.  
  2. %token "\bdouble\b" => DOUBLE;
  3. %token "\;" => ';';
  4.  

Der Quelltext wird dann in die einzelnen Tokens unterteilt und man kann den Syntax definieren. Dabei gelten folgende regeln:
ein Programm wird durch einen Identifier ":=" der Kette, einer optionalen Funktion und ";" definiert. Das Programm "PROGRAM" dient als Einstiegspunkt. Beispiel:
Code:
  1.  
  2. expression := DOUBLE;
  3. statement := expression ';' => load(statcounter) incr(statcounter);
  4.  

eine Kette ist eine Reihe von Tokens die durch whitespace getrennt werden. Ketten koennen mithilfe des "|"-Operators zu einer Kette vereint werden. Dabei muss mindestens eine der Unterketten richtig sein.
Code:
  1.  
  2. expression := CHAR | SHORT | INT | LONG;
  3.  

Funktionen koennen entweder fuer einzelnen Unterketten (->) oder ganze Programme (=>) definiert werden:
Code:
  1.  
  2. expression := CHAR -> int8
  3.                   | SHORT -> int16
  4.                   | INT -> int32
  5.                   | LONG -> int64
  6.                   => hallo world;
  7.  

[{int}] : ist der Substring der durch den Token symbolisiert wird
Code:
  1.  
  2. expression := INT_LITERAL -> [0];
  3.  

pop({int}) : loescht N-Elemente vom Ausgabe Stack und gibt das letzte Nte Element aus.
Code:
  1.  
  2. expression := INT_LITERAL -> [0];
  3. statement := expression ';' => load(statcounter) pop(1) incr(statcounter);
  4.  

popi({int}) :genau wie pop nur das nichts ausgegeben wird.
peek({int}) : genau wie pop nur das nichts geloescht wird.

incr({name}) : wenn die Variable {name} ein integer ist, dann wird diese um 1 erhoeht
decr({name}) : wenn die Variable {name} ein integer ist,dann wird diese um 1 verringer (minimum ist 0)
save({name},{Funktion}) : speichert die Ausgabe einer Funktion in eine Variable
Code:
  1.  
  2. expression := INT_LITERAL -> [0];
  3. statement := expression ';' => save(statements,load(statements,load(statcounter) pop(1) ) incr(statcounter);
  4.  

load({name}) : gibt den Inhalt einer Variable aus
und hier mal ein etwas komplexeres Beispiel
Code:
  1.  
  2. %token "\bbyte\b" => BYTE;
  3. %token "\bshort\b" => SHORT;
  4. %token "\bint\b" => INT;
  5. %token "\blong\b" => LONG;
  6. %token "\bsigned\b" => SIGNED;
  7. %token "\bunsigned\b" => UNSIGNED;
  8. %token "\bfloat\b" => FLOAT;
  9. %token "\bdouble\b" => DOUBLE;
  10.  
  11.  
  12. %token "\bnull\b" => NULL;
  13. %token "\b([0-9]*\.[0-9]+(f|F)?)\b" => FLOAT_LITERAL;
  14. %token "\b([0-9]+(u|U|l|L)?)\b|\b(0[xX][a-fA-F0-9]+)\b" => INTEGER_LITERAL;
  15. %token "\b([_][a-zA-Z0-9]|[a-zA-Z])\w*\b" => IDENTIFIER;
  16. %token "\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"" => STRING_LITERAL;
  17.  
  18. %token "\+\=" => ADD_ASSIGN;
  19. %token "\-\=" => SUB_ASSIGN;
  20. %token "\<\<\=" => LEFT_ASSIGN;
  21. %token "\>\>\=" => RIGHT_ASSIGN;
  22. %token "\*\=" => MUL_ASSIGN;
  23. %token "\/\=" => DIV_ASSIGN;
  24. %token "\%\=" => MOD_ASSIGN;
  25. %token "\&\=" => AND_ASSIGN;
  26. %token "\^\=" => XOR_ASSIGN;
  27. %token "\|\=" => OR_ASSIGN;
  28. %token "\bref\b" => REF;
  29. %token "\<\< => LEFT;
  30. %token "\>\> => RIGHT;
  31. %token "\+\+" => INCR;
  32. %token "\-\-" => DECR;
  33. %token "\&\&" => AND;
  34. %token "\|\|" => OR;
  35. %token "\<\=" => LEQUAL;
  36. %token "\>\=" => GEQUAL;
  37. %token "\=\=" => EQUAL;
  38. %token "\!\=" => NEQUAL;
  39. %token "\<" => '<';
  40. %token "\>" => '>';
  41. %token "\&" => '&';
  42. %token "\|" => '|';
  43. %token "\^" => '^';
  44. %token "\!" => '!';
  45. %token "\+" => '+';
  46. %token "\-" => '-';
  47. %token "\*" => '*';
  48. %token "\/" => '/';
  49. %token "\%" => '%';
  50. %token "\(" => '(';
  51. %token "\)" => ')';
  52. %token "\[" => '[';
  53. %token "\]" => ']';
  54. %token "\{" => '{';
  55. %token "\}" => '}';
  56. %token "\;" => ';';
  57. %token "\?" => '?';
  58. %token "\:" => ':';
  59. %token "\=" => '=';
  60. %token "\." => '.';
  61. %token "\~" => '~';
  62. %token "\," => ',';
  63.  
  64.  
  65. primary_expression := FLOAT_LITERAL     -> load.float [0] incr(exprstack)
  66.                    | INTEGER_LITERAL    -> load.integer [0] incr(exprstack)
  67.                    | STRING_LITERAL     -> load.string [0] incr(exprstack)
  68.                    | IDENTIFIER         -> load.field [0] incr(exprstack)
  69.                    | '(' constant_expression ')' -> load(expression) save(expression, );
  70.  
  71. postfix_expression := primary_expression -> save(expression,load(expression)\npop(1))
  72.                    | postfix_expression '(' ')' -> save(expression,load(expression)\ncall)
  73.                    | postfix_expression '.' IDENTIFIER -> save(expression,load(expression)\nload.member [2]);
  74.  
  75.  
  76. unary_expression := postfix_expression
  77.                  | INCR unary_expression -> save(expression,load.integer 1\nadd\nload(expression))
  78.                  | DECR unary_expression -> save(expression,load.integer 1\nsub\nload(expression))
  79.                  | REF unary_expression -> save(expression,load(expression)\nref)
  80.                  | '-' unary_expression -> save(expression,load(expression)\ninvert)
  81.                  | '~' unary_expression -> save(expression,load(expression)\nbitinv)
  82.                  | '!' unary_expression -> save(expression,load(expression)\nnot);
  83.  
  84.  
  85. multiplicative_expression := unary_expression
  86.                           | multiplicative_expression '*' unary_expression -> save(expression,pop(1)load(expression)\nmul)
  87.                           | multiplicative_expression '/' unary_expression -> save(expression,pop(1)load(expression)\ndiv)
  88.                           | multiplicative_expression '%' unary_expression -> save(expression,pop(1)load(expression)\nmod)
  89.                           => load(expression) save(expression, );
  90. additive_expression := multiplicative_expression -> save(expression,pop(1))
  91.                     | additive_expression '+' multiplicative_expression -> save(expression,\npop(1)\npop(1)\nadd)
  92.                     | additive_expression '-' multiplicative_expression -> save(expression,\npop(1)\npop(1)\nsub)
  93.                     => load(expression) save(expression, );
  94.  
  95. constant_expression := additive_expression -> save(expression,pop(1)) ;
  96.  
  97. field_typename   := BYTE                -> save(typename,uint8)
  98.                  | UNSIGNED SHORT       -> save(typename,uint16)
  99.                  | UNSIGNED INT         -> save(typename,uint32)
  100.                  | UNSIGNED LONG        -> save(typename,uint64)
  101.                  | SHORT                -> save(typename,int16)
  102.                  | INT                  -> save(typename,int32)
  103.                  | LONG                 -> save(typename,int64)
  104.                  | SIGNED SHORT         -> save(typename,int16)
  105.                  | SIGNED INT           -> save(typename,int32)
  106.                  | SIGNED LONG          -> save(typename,int64)
  107.                  | FLOAT                -> save(typename,float32)
  108.                  | DOUBLE               -> save(typename,float64)
  109.                  | IDENTIFIER           -> save(typename,[0]);
  110.  
  111.  
  112. field_initializer := IDENTIFIER -> load(typename) [0] save(varname,[0]) save([0],load(typename))
  113.                   | IDENTIFIER '=' constant_expression -> load(typename) [0] save(varname,[0]) save([0],load(typename))
  114. save(expression,load(expression)\nset.field [0]\n);
  115.  
  116. variable_declaration := field_typename field_initializer
  117.                      | variable_declaration ',' field_initializer;
  118.  
  119. variable_list := variable_declaration ';'
  120.         | variable_list variable_declaration ';';
  121.  
  122. PROGRAM := variable_list -> \nload(expression);
  123.  

Code:
  1.  
  2. Das ganze macht aus:
  3. string stringa="hallo",strinb="world",stringc="sup";
  4. byte firstvar = stringa.get_length() * (6 + 12);
  5. int secvar;
  6.  

Folgendes:
Code:
  1.  
  2. string stringa
  3. string strinb
  4. string stringc
  5. uint8 firstvar
  6. int32 secvar
  7.  
  8.  
  9. load.string "hallo"
  10. set.field stringa
  11.  
  12. load.string "world"
  13. set.field strinb
  14.  
  15. load.string "sup"
  16. set.field stringc
  17.  
  18. load.field stringa
  19. load.member get_length
  20. call
  21.  
  22.  
  23. load.integer 6
  24.  
  25. load.integer 12
  26. add
  27. mul
  28. set.field firstvar
  29.  
  30.  
  31.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.027s | 17 Queries | GZIP : On ]