The following grammar is presented in the YACC format. The terminal symbol are written as capital letters, while the not terminal symbol are written as small letters.
1 type : BYTE 2 | WORD 3 | DWORD 4 name : NAME 5 number : NUMBER 6 | C_H_NUM 7 | C_O_NUM 8 | LIT_CH 9 cost_str : COST_STRING 10 expression : name 11 | name '[' expression']' 12 | ch_funz 13 | number 19 | '(' expression ')' 20 | expression '+' expression 21 | expression LSHIFT expression 22 | expression RSHIFT expression 23 | expression NOT_EQ expression 24 | expression MIU expression 25 | expression MAU expression 26 | expression '<' expression 27 | expression '>' expression 28 | expression EQ expression 29 | expression AND expression 30 | expression OR expression 31 | expression '-' expression 32 | expression '*' expression 33 | expression '/' expression 34 | expression '%' expression 35 | '-' expression 36 | NOT expression 37 | assignment 38 | SIZEOF '(' name ')' 39 | OFFSETOF '(' name ')' 40 | COMMAND '(' cost_str ')' 41 | LEN '(' name ')' 42 | STRLEN '(' name ')' 43 assignment : name '=' expression 44 | name '[' expression ']' '=' expression 45 ch_funz : name '(' l_espress ')' 46 | name '(' ')' 47 l_espress : expression 48 | l_espress ',' expression 49 programm : llinee 50 | 51 llinee : declarations 52 | c_function 53 | llinee declarations 54 | llinee c_function 55 declarations : prototype 56 prototype : type name '(' ')' ';' 57 | type name '(' l_variables ')' ';' 58 | ARRAY name ';' 59 l_variables : type name 60 | name 61 | l_variables ',' type name 62 | l_variables ',' name 63 def_var : def_v ';' 64 def_v : type name 65 | def_v ',' name 66 | type error 67 linstructions : linstructions instruction 68 | instruction 69 | error 70 instruction : istruz ';' 71 | costrutto 72 | def_var 73 | '{' linstructions '}' 74 | '{' '}' 75 costrutto : c_do 76 | c_while 77 | c_if 78 | c_for 79 do : DO 80 while : WHILE 81 for : FOR 82 if : IF 83 else : ELSE 84 $$1 : 85 c_do : do instruction WHILE $$1 '(' expression ')' ';' 86 | do instruction WHILE error 87 $$2 : 88 c_while : while '(' expression ')' $$2 instruction 89 | while error 90 t_if : 91 c_if : if '(' expression ')' t_if instruction 92 $$3 : 93 c_if : if '(' expression ')' t_if instruction else $$3 instruction 94 | if error 95 $$4 : 96 $$5 : 97 $$6 : 98 c_for : for '(' expression ';' $$4 expression ';' $$5 expression ')' $$6 instruction 99 | for error 100 $$7 : 101 c_function : type name '(' ')' $$7 '{' linstructions '}' 102 $$8 : 103 c_function : type name '(' l_variables ')' $$8 '{' linstructions '}' 104 | type name '(' error 105 istruz : CONTINUE 106 | BREAK 107 | expression 108 | TITLE '(' cost_str ')' 109 | TITLE '(' cost_str ',' l_espress ')' 110 | PRINT '(' cost_str ',' l_espress ')' 111 | PRINT '(' cost_str ')' 112 | APRINT '(' cost_str ',' name ')' 113 | CLEAR '(' name ')' 114 | RETURN expression 115 | prototype
'file' is the beginning symbol.
Here it is the table which shows the priority order of the operators in the expressions:
Low priority | |
Operators | The operator is associated to the expression on the: |
'=' | right |
OR | left |
AND | left |
EQ,NOT_EQ,'<','>',MIU,MAU | left |
LSHIFT,RSHIFT | left |
'+','-' | left |
'*','/','%' | left |
NOT,MENO_UNARIO | right |
CH_FUNZ | left |
High priority |
Here it is a summary of the scanner which recognize the file tokens. This summary is presented in the LEX format.
SPACE ([\t\r\n ]) SPACES ({SPACE}*) LETTER ([a-zA-Z]) DIGIT ([0-9]) F_DIGIT ([1-9]) DECIMALE ({DIGIT}*{F_DIGIT}|0) FINO_FINE ([^\n]*) R_REM (\/\/) HEX ((("0x")|("0X"))([a-fA-F]|{DIGIT})+) OCT (("0")([0-7])+) INTERO ({F_DIGIT}{DIGIT}*) VAR_NAME ((("_")|{LETTER})({LETTER}|{DIGIT}|("_"))*) COST_STRINGA (\"[^\"\n]*\") COST_INT_CORTO ({INTERO}|[0]) QUOTE \'([^\\']|\\[^'\\]+|\\\\)\' OP ([-+=*/<>{}();,:%])|("\[")|("\]") VAR ({VAR_NAME}) COMMENT ("/*"([^*]*|"*"+[^*/])"*"+\/) COMMENT_L ("//".*) %% \xd /* discard LF*/ {COMMENT} { /* discard comments */ } {COMMENT_L} { /* discard comments */ } do {return DO; } if {return IF; } else {return ELSE; } while {return WHILE; } for {return FOR; } return {return RETURN; } break {return BREAK; } continue {return CONTINUE; } array {return ARRAY; } byte {return BYTE; } word {return WORD; } dword {return DWORD; } sizeof {return SIZEOF; } offsetof {return OFFSETOF; } printf {return PRINT; } aprintf {return APRINT; } clear {return CLEAR; } arrlen {return LEN; } strlen {return STRLEN; } title {return TITLE; } command {return COMMAND;} {COST_STRINGA} {return COST_STRINGA; } {COST_INT_CORTO} {return NUMERO; } {HEX} {return C_H_NUM; } {OCT} {return C_O_NUM; } {QUOTE} {return LIT_CH; } AND {return AND;} "&" {return AND;} "&&" {return AND;} OR {return OR;} "|" {return OR;} "||" {return OR;} NOT {return NOT;} "!" {return NOT;} "~" {return NOT;} {OP} {return *yytext; } "==" {return EQ; } "!=" {return NOT_EQ; } ">=" {return MAU; } "<=" {return MIU; } "<<" {return LSHIFT; } ">>" {return RSHIFT; } {VAR} {return NAME;} {SPACE}+ {} . {printf("Scanner error at line %d\n",yylineno);} %%
'AND' can be written : 'AND', '&&', '&'
'OR' can be written : 'OR', '||', '|'
'NOT' can be written : 'NOT', '!', '~'
'=' can be written : '==', '='