Några lösningsförslag till koi-civ-hemtentan 2021-03-15 ------------------------------------------------------- Uppgift 1 --------- a) KLART KOPPLA MOTSTAND PUNKT SKAPA SPANNINGSKALLA TILL HELTAL SEMIKOLON b) HELTAL: [0-9]+ Uppgift 2 --------- Filen "krets.l": %{ #include "krets.tab.h" // Bara för att få token-definitionerna %} %% [\n\t ] { /* Ignorera whitespace, inklusive radslut */ } "klart" { return KLART; } "koppla" { return KOPPLA; } "motstånd" { return MOTSTAND; } "punkt" { return PUNKT; } "skapa" { return SKAPA; } "spänningskälla" { return SPANNINGSKALLA; } "till" { return TILL; } [0-9]+ { /* printf("[HELTAL: '%s']", yytext); */ return HELTAL; } ";" { return SEMIKOLON; } . { fprintf(stderr, "[Ignorerar felaktigt tecken: '%c']\n", *yytext); } %% Uppgift 3 --------- Grammatiken i form av en Bison-fil, "krets.y": %{ #include void yyerror(const char *s); int yylex(void); %} %token KLART KOPPLA MOTSTAND PUNKT SKAPA SPANNINGSKALLA TILL HELTAL SEMIKOLON %define parse.error verbose %start krets %% krets : kommandolista klartkommando; kommandolista : kommando kommandolista | %empty ; kommando : skapakommando | kopplakommando ; skapakommando : SKAPA sak HELTAL SEMIKOLON ; sak : PUNKT | SPANNINGSKALLA | MOTSTAND ; kopplakommando : KOPPLA sak HELTAL TILL sak HELTAL SEMIKOLON; klartkommando : KLART SEMIKOLON ; %% int main() { printf("Mata in en krets. Avsluta med \"klart\" och semikolon.\n"); yyparse(); printf("Klart!\n"); return 0; } void yyerror(const char *s) { printf("Ogiltig inmatning! Felmeddelande: %s\n", s); } int yywrap(void) { return 1; }