Project Parser
* c_compiler from http://www.csd.uwo.ca/courses/CS447a/parts/ansi-c-grammar/
* calc from the bison documentation
committer: Markus Bröker <mbroeker@largo.homelinux.org>
--- a/Makefile
+++ b/Makefile
@@ -100,7 +100,7 @@
@$(CC) $(CFLAGS) -o $@ $<
data_types: data_types.c
- @echo Linking $< ...
+ @echo Compiling $< ...
@$(CC) $(CFLAGS) -std=c99 -o $@ $<
dnsresolve: dnsresolve.o
--- a/parser/c_compiler/lexer.l
+++ b/parser/c_compiler/lexer.l
@@ -1,151 +1,150 @@
%{
- #include <prototypes.h>
- #include "parser.h"
- int column = 0;
- int c;
+ #include <prototypes.h>
+ #include "parser.h"
+ int column = 0;
+ int c;
%}
-D [0-9]
-L [a-zA-Z_]
-H [a-fA-F0-9]
-E [Ee][+-]?{D}+
-FS (f|F|l|L)
-IS (u|U|l|L)*
+D [0-9]
+L [a-zA-Z_]
+H [a-fA-F0-9]
+E [Ee][+-]?{D}+
+FS (f|F|l|L)
+IS (u|U|l|L)*
%%
-"/*" { comment(); }
-"#include <" { c = input(); while ( c != '>') c = input(); }
-"#include \"" { c = input(); while ( c != '\"') c = input(); }
+"/*" { comment(); }
+"#include <" { c = input(); while ( c != '>') c = input(); }
+"#include \"" { c = input(); while ( c != '\"') c = input(); }
-"auto" { count(); return(AUTO); }
-"break" { count(); return(BREAK); }
-"case" { count(); return(CASE); }
-"char" { count(); return(CHAR); }
-"const" { count(); return(CONST); }
-"continue" { count(); return(CONTINUE); }
-"default" { count(); return(DEFAULT); }
-"do" { count(); return(DO); }
-"double" { count(); return(DOUBLE); }
-"else" { count(); return(ELSE); }
-"enum" { count(); return(ENUM); }
-"extern" { count(); return(EXTERN); }
-"float" { count(); return(FLOAT); }
-"for" { count(); return(FOR); }
-"goto" { count(); return(GOTO); }
-"if" { count(); return(IF); }
-"int" { count(); return(INT); }
-"long" { count(); return(LONG); }
-"register" { count(); return(REGISTER); }
-"return" { count(); return(RETURN); }
-"short" { count(); return(SHORT); }
-"signed" { count(); return(SIGNED); }
-"sizeof" { count(); return(SIZEOF); }
-"static" { count(); return(STATIC); }
-"struct" { count(); return(STRUCT); }
-"switch" { count(); return(SWITCH); }
-"typedef" { count(); return(TYPEDEF); }
-"union" { count(); return(UNION); }
-"unsigned" { count(); return(UNSIGNED); }
-"void" { count(); return(VOID); }
-"volatile" { count(); return(VOLATILE); }
-"while" { count(); return(WHILE); }
+"auto" { count(); return(AUTO); }
+"break" { count(); return(BREAK); }
+"case" { count(); return(CASE); }
+"char" { count(); return(CHAR); }
+"const" { count(); return(CONST); }
+"continue" { count(); return(CONTINUE); }
+"default" { count(); return(DEFAULT); }
+"do" { count(); return(DO); }
+"double" { count(); return(DOUBLE); }
+"else" { count(); return(ELSE); }
+"enum" { count(); return(ENUM); }
+"extern" { count(); return(EXTERN); }
+"float" { count(); return(FLOAT); }
+"for" { count(); return(FOR); }
+"goto" { count(); return(GOTO); }
+"if" { count(); return(IF); }
+"int" { count(); return(INT); }
+"long" { count(); return(LONG); }
+"register" { count(); return(REGISTER); }
+"return" { count(); return(RETURN); }
+"short" { count(); return(SHORT); }
+"signed" { count(); return(SIGNED); }
+"sizeof" { count(); return(SIZEOF); }
+"static" { count(); return(STATIC); }
+"struct" { count(); return(STRUCT); }
+"switch" { count(); return(SWITCH); }
+"typedef" { count(); return(TYPEDEF); }
+"union" { count(); return(UNION); }
+"unsigned" { count(); return(UNSIGNED); }
+"void" { count(); return(VOID); }
+"volatile" { count(); return(VOLATILE); }
+"while" { count(); return(WHILE); }
-{L}({L}|{D})* { count(); return(check_type()); }
-0[xX]{H}+{IS}? { count(); return(CONSTANT); }
-0{D}+{IS}? { count(); return(CONSTANT); }
-{D}+{IS}? { count(); return(CONSTANT); }
-'(\\.|[^\\'])+' { count(); return(CONSTANT); }
+{L}({L}|{D})* { count(); return(check_type()); }
+0[xX]{H}+{IS}? { count(); return(CONSTANT); }
+0{D}+{IS}? { count(); return(CONSTANT); }
+{D}+{IS}? { count(); return(CONSTANT); }
+'(\\.|[^\\'])+' { count(); return(CONSTANT); }
-{D}+{E}{FS}? { count(); return(CONSTANT); }
-{D}*"."{D}+({E})?{FS}? { count(); return(CONSTANT); }
-{D}+"."{D}*({E})?{FS}? { count(); return(CONSTANT); }
-
-\"(\\.|[^\\"])*\" { count(); return(STRING_LITERAL); }
+{D}+{E}{FS}? { count(); return(CONSTANT); }
+{D}*"."{D}+({E})?{FS}? { count(); return(CONSTANT); }
+{D}+"."{D}*({E})?{FS}? { count(); return(CONSTANT); }
-">>=" { count(); return(RIGHT_ASSIGN); }
-"<<=" { count(); return(LEFT_ASSIGN); }
-"+=" { count(); return(ADD_ASSIGN); }
-"-=" { count(); return(SUB_ASSIGN); }
-"*=" { count(); return(MUL_ASSIGN); }
-"/=" { count(); return(DIV_ASSIGN); }
-"%=" { count(); return(MOD_ASSIGN); }
-"&=" { count(); return(AND_ASSIGN); }
-"^=" { count(); return(XOR_ASSIGN); }
-"|=" { count(); return(OR_ASSIGN); }
-">>" { count(); return(RIGHT_OP); }
-"<<" { count(); return(LEFT_OP); }
-"++" { count(); return(INC_OP); }
-"--" { count(); return(DEC_OP); }
-"->" { count(); return(PTR_OP); }
-"&&" { count(); return(AND_OP); }
-"||" { count(); return(OR_OP); }
-"<=" { count(); return(LE_OP); }
-">=" { count(); return(GE_OP); }
-"==" { count(); return(EQ_OP); }
-"!=" { count(); return(NE_OP); }
-";" { count(); return(';'); }
-"{" { count(); return('{'); }
-"}" { count(); return('}'); }
-"," { count(); return(','); }
-":" { count(); return(':'); }
-"=" { count(); return('='); }
-"(" { count(); return('('); }
-")" { count(); return(')'); }
-"[" { count(); return('['); }
-"]" { count(); return(']'); }
-"." { count(); return('.'); }
-"&" { count(); return('&'); }
-"!" { count(); return('!'); }
-"~" { count(); return('~'); }
-"-" { count(); return('-'); }
-"+" { count(); return('+'); }
-"*" { count(); return('*'); }
-"/" { count(); return('/'); }
-"%" { count(); return('%'); }
-"<" { count(); return('<'); }
-">" { count(); return('>'); }
-"^" { count(); return('^'); }
-"|" { count(); return('|'); }
-"?" { count(); return('?'); }
+\"(\\.|[^\\"])*\" { count(); return(STRING_LITERAL); }
-[ \t\v\n\f] { count(); }
-. { printf ("Unknown Token: %s\n", yytext); }
+">>=" { count(); return(RIGHT_ASSIGN); }
+"<<=" { count(); return(LEFT_ASSIGN); }
+"+=" { count(); return(ADD_ASSIGN); }
+"-=" { count(); return(SUB_ASSIGN); }
+"*=" { count(); return(MUL_ASSIGN); }
+"/=" { count(); return(DIV_ASSIGN); }
+"%=" { count(); return(MOD_ASSIGN); }
+"&=" { count(); return(AND_ASSIGN); }
+"^=" { count(); return(XOR_ASSIGN); }
+"|=" { count(); return(OR_ASSIGN); }
+">>" { count(); return(RIGHT_OP); }
+"<<" { count(); return(LEFT_OP); }
+"++" { count(); return(INC_OP); }
+"--" { count(); return(DEC_OP); }
+"->" { count(); return(PTR_OP); }
+"&&" { count(); return(AND_OP); }
+"||" { count(); return(OR_OP); }
+"<=" { count(); return(LE_OP); }
+">=" { count(); return(GE_OP); }
+"==" { count(); return(EQ_OP); }
+"!=" { count(); return(NE_OP); }
+";" { count(); return(';'); }
+"{" { count(); return('{'); }
+"}" { count(); return('}'); }
+"," { count(); return(','); }
+":" { count(); return(':'); }
+"=" { count(); return('='); }
+"(" { count(); return('('); }
+")" { count(); return(')'); }
+"[" { count(); return('['); }
+"]" { count(); return(']'); }
+"." { count(); return('.'); }
+"&" { count(); return('&'); }
+"!" { count(); return('!'); }
+"~" { count(); return('~'); }
+"-" { count(); return('-'); }
+"+" { count(); return('+'); }
+"*" { count(); return('*'); }
+"/" { count(); return('/'); }
+"%" { count(); return('%'); }
+"<" { count(); return('<'); }
+">" { count(); return('>'); }
+"^" { count(); return('^'); }
+"|" { count(); return('|'); }
+"?" { count(); return('?'); }
+[ \t\v\n\f] { count(); }
+. { printf ("Unknown Token: %s\n", yytext); }
%%
int yywrap()
{
- /* stop after eof */
- return 1;
+ /* stop after eof */
+ return 1;
}
int count()
{
- int i;
+ int i;
- for (i = 0; yytext[i] != '\0'; i++)
- if (yytext[i] == '\n')
- column = 0;
- else if (yytext[i] == '\t')
- column += 4 - (column % 4);
- else
- column++;
+ for (i = 0; yytext[i] != '\0'; i++)
+ if (yytext[i] == '\n')
+ column = 0;
+ else if (yytext[i] == '\t')
+ column += 4 - (column % 4);
+ else
+ column++;
- return column;
+ return column;
}
int check_type()
{
- return IDENTIFIER;
+ return IDENTIFIER;
}
-void comment()
+void comment()
{
- int c;
+ int c;
- c = input();
- do {
- while ( c != '*')
- c = input();
- c=input();
- } while(c != '/');
+ c = input();
+ do {
+ while ( c != '*')
+ c = input();
+ c=input();
+ } while(c != '/');
}
--- a/parser/c_compiler/parser.y
+++ b/parser/c_compiler/parser.y
@@ -1,5 +1,5 @@
%{
- #include "prototypes.h"
+ #include "prototypes.h"
%}
%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF
%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
@@ -17,409 +17,409 @@
%%
primary_expr
- : identifier
- | CONSTANT
- | STRING_LITERAL
- | '(' expr ')'
- ;
+ : identifier
+ | CONSTANT
+ | STRING_LITERAL
+ | '(' expr ')'
+ ;
postfix_expr
- : primary_expr
- | postfix_expr '[' expr ']'
- | postfix_expr '(' ')'
- | postfix_expr '(' argument_expr_list ')'
- | postfix_expr '.' identifier
- | postfix_expr PTR_OP identifier
- | postfix_expr INC_OP
- | postfix_expr DEC_OP
- ;
+ : primary_expr
+ | postfix_expr '[' expr ']'
+ | postfix_expr '(' ')'
+ | postfix_expr '(' argument_expr_list ')'
+ | postfix_expr '.' identifier
+ | postfix_expr PTR_OP identifier
+ | postfix_expr INC_OP
+ | postfix_expr DEC_OP
+ ;
argument_expr_list
- : assignment_expr
- | argument_expr_list ',' assignment_expr
- ;
+ : assignment_expr
+ | argument_expr_list ',' assignment_expr
+ ;
unary_expr
- : postfix_expr
- | INC_OP unary_expr
- | DEC_OP unary_expr
- | unary_operator cast_expr
- | SIZEOF unary_expr
- | SIZEOF '(' type_name ')'
- ;
+ : postfix_expr
+ | INC_OP unary_expr
+ | DEC_OP unary_expr
+ | unary_operator cast_expr
+ | SIZEOF unary_expr
+ | SIZEOF '(' type_name ')'
+ ;
unary_operator
- : '&'
- | '*'
- | '+'
- | '-'
- | '~'
- | '!'
- ;
+ : '&'
+ | '*'
+ | '+'
+ | '-'
+ | '~'
+ | '!'
+ ;
cast_expr
- : unary_expr
- | '(' type_name ')' cast_expr
- ;
+ : unary_expr
+ | '(' type_name ')' cast_expr
+ ;
multiplicative_expr
- : cast_expr
- | multiplicative_expr '*' cast_expr
- | multiplicative_expr '/' cast_expr
- | multiplicative_expr '%' cast_expr
- ;
+ : cast_expr
+ | multiplicative_expr '*' cast_expr
+ | multiplicative_expr '/' cast_expr
+ | multiplicative_expr '%' cast_expr
+ ;
additive_expr
- : multiplicative_expr
- | additive_expr '+' multiplicative_expr
- | additive_expr '-' multiplicative_expr
- ;
+ : multiplicative_expr
+ | additive_expr '+' multiplicative_expr
+ | additive_expr '-' multiplicative_expr
+ ;
shift_expr
- : additive_expr
- | shift_expr LEFT_OP additive_expr
- | shift_expr RIGHT_OP additive_expr
- ;
+ : additive_expr
+ | shift_expr LEFT_OP additive_expr
+ | shift_expr RIGHT_OP additive_expr
+ ;
relational_expr
- : shift_expr
- | relational_expr '<' shift_expr
- | relational_expr '>' shift_expr
- | relational_expr LE_OP shift_expr
- | relational_expr GE_OP shift_expr
- ;
+ : shift_expr
+ | relational_expr '<' shift_expr
+ | relational_expr '>' shift_expr
+ | relational_expr LE_OP shift_expr
+ | relational_expr GE_OP shift_expr
+ ;
equality_expr
- : relational_expr
- | equality_expr EQ_OP relational_expr
- | equality_expr NE_OP relational_expr
- ;
+ : relational_expr
+ | equality_expr EQ_OP relational_expr
+ | equality_expr NE_OP relational_expr
+ ;
and_expr
- : equality_expr
- | and_expr '&' equality_expr
- ;
+ : equality_expr
+ | and_expr '&' equality_expr
+ ;
exclusive_or_expr
- : and_expr
- | exclusive_or_expr '^' and_expr
- ;
+ : and_expr
+ | exclusive_or_expr '^' and_expr
+ ;
inclusive_or_expr
- : exclusive_or_expr
- | inclusive_or_expr '|' exclusive_or_expr
- ;
+ : exclusive_or_expr
+ | inclusive_or_expr '|' exclusive_or_expr
+ ;
logical_and_expr
- : inclusive_or_expr
- | logical_and_expr AND_OP inclusive_or_expr
- ;
+ : inclusive_or_expr
+ | logical_and_expr AND_OP inclusive_or_expr
+ ;
logical_or_expr
- : logical_and_expr
- | logical_or_expr OR_OP logical_and_expr
- ;
+ : logical_and_expr
+ | logical_or_expr OR_OP logical_and_expr
+ ;
conditional_expr
- : logical_or_expr
- | logical_or_expr '?' logical_or_expr ':' conditional_expr
- ;
+ : logical_or_expr
+ | logical_or_expr '?' logical_or_expr ':' conditional_expr
+ ;
assignment_expr
- : conditional_expr
- | unary_expr assignment_operator assignment_expr
- ;
+ : conditional_expr
+ | unary_expr assignment_operator assignment_expr
+ ;
assignment_operator
- : '='
- | MUL_ASSIGN
- | DIV_ASSIGN
- | MOD_ASSIGN
- | ADD_ASSIGN
- | SUB_ASSIGN
- | LEFT_ASSIGN
- | RIGHT_ASSIGN
- | AND_ASSIGN
- | XOR_ASSIGN
- | OR_ASSIGN
- ;
+ : '='
+ | MUL_ASSIGN
+ | DIV_ASSIGN
+ | MOD_ASSIGN
+ | ADD_ASSIGN
+ | SUB_ASSIGN
+ | LEFT_ASSIGN
+ | RIGHT_ASSIGN
+ | AND_ASSIGN
+ | XOR_ASSIGN
+ | OR_ASSIGN
+ ;
expr
- : assignment_expr
- | expr ',' assignment_expr
- ;
+ : assignment_expr
+ | expr ',' assignment_expr
+ ;
constant_expr
- : conditional_expr
- ;
+ : conditional_expr
+ ;
declaration
- : declaration_specifiers ';'
- | declaration_specifiers init_declarator_list ';'
- ;
+ : declaration_specifiers ';'
+ | declaration_specifiers init_declarator_list ';'
+ ;
declaration_specifiers
- : storage_class_specifier
- | storage_class_specifier declaration_specifiers
- | type_specifier
- | type_specifier declaration_specifiers
- ;
+ : storage_class_specifier
+ | storage_class_specifier declaration_specifiers
+ | type_specifier
+ | type_specifier declaration_specifiers
+ ;
init_declarator_list
- : init_declarator
- | init_declarator_list ',' init_declarator
- ;
+ : init_declarator
+ | init_declarator_list ',' init_declarator
+ ;
init_declarator
- : declarator
- | declarator '=' initializer
- ;
+ : declarator
+ | declarator '=' initializer
+ ;
storage_class_specifier
- : TYPEDEF
- | EXTERN
- | STATIC
- | AUTO
- | REGISTER
- ;
+ : TYPEDEF
+ | EXTERN
+ | STATIC
+ | AUTO
+ | REGISTER
+ ;
type_specifier
- : CHAR
- | SHORT
- | INT
- | LONG
- | SIGNED
- | UNSIGNED
- | FLOAT
- | DOUBLE
- | CONST
- | VOLATILE
- | VOID
- | struct_or_union_specifier
- | enum_specifier
- | TYPE_NAME
- ;
+ : CHAR
+ | SHORT
+ | INT
+ | LONG
+ | SIGNED
+ | UNSIGNED
+ | FLOAT
+ | DOUBLE
+ | CONST
+ | VOLATILE
+ | VOID
+ | struct_or_union_specifier
+ | enum_specifier
+ | TYPE_NAME
+ ;
struct_or_union_specifier
- : struct_or_union identifier '{' struct_declaration_list '}'
- | struct_or_union '{' struct_declaration_list '}'
- | struct_or_union identifier
- ;
+ : struct_or_union identifier '{' struct_declaration_list '}'
+ | struct_or_union '{' struct_declaration_list '}'
+ | struct_or_union identifier
+ ;
struct_or_union
- : STRUCT
- | UNION
- ;
+ : STRUCT
+ | UNION
+ ;
struct_declaration_list
- : struct_declaration
- | struct_declaration_list struct_declaration
- ;
+ : struct_declaration
+ | struct_declaration_list struct_declaration
+ ;
struct_declaration
- : type_specifier_list struct_declarator_list ';'
- ;
+ : type_specifier_list struct_declarator_list ';'
+ ;
struct_declarator_list
- : struct_declarator
- | struct_declarator_list ',' struct_declarator
- ;
+ : struct_declarator
+ | struct_declarator_list ',' struct_declarator
+ ;
struct_declarator
- : declarator
- | ':' constant_expr
- | declarator ':' constant_expr
- ;
+ : declarator
+ | ':' constant_expr
+ | declarator ':' constant_expr
+ ;
enum_specifier
- : ENUM '{' enumerator_list '}'
- | ENUM identifier '{' enumerator_list '}'
- | ENUM identifier
- ;
+ : ENUM '{' enumerator_list '}'
+ | ENUM identifier '{' enumerator_list '}'
+ | ENUM identifier
+ ;
enumerator_list
- : enumerator
- | enumerator_list ',' enumerator
- ;
+ : enumerator
+ | enumerator_list ',' enumerator
+ ;
enumerator
- : identifier
- | identifier '=' constant_expr
- ;
+ : identifier
+ | identifier '=' constant_expr
+ ;
declarator
- : declarator2
- | pointer declarator2
- ;
+ : declarator2
+ | pointer declarator2
+ ;
declarator2
- : identifier
- | '(' declarator ')'
- | declarator2 '[' ']'
- | declarator2 '[' constant_expr ']'
- | declarator2 '(' ')'
- | declarator2 '(' parameter_type_list ')'
- | declarator2 '(' parameter_identifier_list ')'
- ;
+ : identifier
+ | '(' declarator ')'
+ | declarator2 '[' ']'
+ | declarator2 '[' constant_expr ']'
+ | declarator2 '(' ')'
+ | declarator2 '(' parameter_type_list ')'
+ | declarator2 '(' parameter_identifier_list ')'
+ ;
pointer
- : '*'
- | '*' type_specifier_list
- | '*' pointer
- | '*' type_specifier_list pointer
- ;
+ : '*'
+ | '*' type_specifier_list
+ | '*' pointer
+ | '*' type_specifier_list pointer
+ ;
type_specifier_list
- : type_specifier
- | type_specifier_list type_specifier
- ;
+ : type_specifier
+ | type_specifier_list type_specifier
+ ;
parameter_identifier_list
- : identifier_list
- | identifier_list ',' ELIPSIS
- ;
+ : identifier_list
+ | identifier_list ',' ELIPSIS
+ ;
identifier_list
- : identifier
- | identifier_list ',' identifier
- ;
+ : identifier
+ | identifier_list ',' identifier
+ ;
parameter_type_list
- : parameter_list
- | parameter_list ',' ELIPSIS
- ;
+ : parameter_list
+ | parameter_list ',' ELIPSIS
+ ;
parameter_list
- : parameter_declaration
- | parameter_list ',' parameter_declaration
- ;
+ : parameter_declaration
+ | parameter_list ',' parameter_declaration
+ ;
parameter_declaration
- : type_specifier_list declarator
- | type_name
- ;
+ : type_specifier_list declarator
+ | type_name
+ ;
type_name
- : type_specifier_list
- | type_specifier_list abstract_declarator
- ;
+ : type_specifier_list
+ | type_specifier_list abstract_declarator
+ ;
abstract_declarator
- : pointer
- | abstract_declarator2
- | pointer abstract_declarator2
- ;
+ : pointer
+ | abstract_declarator2
+ | pointer abstract_declarator2
+ ;
abstract_declarator2
- : '(' abstract_declarator ')'
- | '[' ']'
- | '[' constant_expr ']'
- | abstract_declarator2 '[' ']'
- | abstract_declarator2 '[' constant_expr ']'
- | '(' ')'
- | '(' parameter_type_list ')'
- | abstract_declarator2 '(' ')'
- | abstract_declarator2 '(' parameter_type_list ')'
- ;
+ : '(' abstract_declarator ')'
+ | '[' ']'
+ | '[' constant_expr ']'
+ | abstract_declarator2 '[' ']'
+ | abstract_declarator2 '[' constant_expr ']'
+ | '(' ')'
+ | '(' parameter_type_list ')'
+ | abstract_declarator2 '(' ')'
+ | abstract_declarator2 '(' parameter_type_list ')'
+ ;
initializer
- : assignment_expr
- | '{' initializer_list '}'
- | '{' initializer_list ',' '}'
- ;
+ : assignment_expr
+ | '{' initializer_list '}'
+ | '{' initializer_list ',' '}'
+ ;
initializer_list
- : initializer
- | initializer_list ',' initializer
- ;
+ : initializer
+ | initializer_list ',' initializer
+ ;
statement
- : labeled_statement
- | compound_statement
- | expression_statement
- | selection_statement
- | iteration_statement
- | jump_statement
- ;
+ : labeled_statement
+ | compound_statement
+ | expression_statement
+ | selection_statement
+ | iteration_statement
+ | jump_statement
+ ;
labeled_statement
- : identifier ':' statement
- | CASE constant_expr ':' statement
- | DEFAULT ':' statement
- ;
+ : identifier ':' statement
+ | CASE constant_expr ':' statement
+ | DEFAULT ':' statement
+ ;
compound_statement
- : '{' '}'
- | '{' statement_list '}'
- | '{' declaration_list '}'
- | '{' declaration_list statement_list '}'
- ;
+ : '{' '}'
+ | '{' statement_list '}'
+ | '{' declaration_list '}'
+ | '{' declaration_list statement_list '}'
+ ;
declaration_list
- : declaration
- | declaration_list declaration
- ;
+ : declaration
+ | declaration_list declaration
+ ;
statement_list
- : statement
- | statement_list statement
- ;
+ : statement
+ | statement_list statement
+ ;
expression_statement
- : ';'
- | expr ';'
- ;
+ : ';'
+ | expr ';'
+ ;
selection_statement
- : IF '(' expr ')' statement
- | IF '(' expr ')' statement ELSE statement
- | SWITCH '(' expr ')' statement
- ;
+ : IF '(' expr ')' statement
+ | IF '(' expr ')' statement ELSE statement
+ | SWITCH '(' expr ')' statement
+ ;
iteration_statement
- : WHILE '(' expr ')' statement
- | DO statement WHILE '(' expr ')' ';'
- | FOR '(' ';' ';' ')' statement
- | FOR '(' ';' ';' expr ')' statement
- | FOR '(' ';' expr ';' ')' statement
- | FOR '(' ';' expr ';' expr ')' statement
- | FOR '(' expr ';' ';' ')' statement
- | FOR '(' expr ';' ';' expr ')' statement
- | FOR '(' expr ';' expr ';' ')' statement
- | FOR '(' expr ';' expr ';' expr ')' statement
- ;
+ : WHILE '(' expr ')' statement
+ | DO statement WHILE '(' expr ')' ';'
+ | FOR '(' ';' ';' ')' statement
+ | FOR '(' ';' ';' expr ')' statement
+ | FOR '(' ';' expr ';' ')' statement
+ | FOR '(' ';' expr ';' expr ')' statement
+ | FOR '(' expr ';' ';' ')' statement
+ | FOR '(' expr ';' ';' expr ')' statement
+ | FOR '(' expr ';' expr ';' ')' statement
+ | FOR '(' expr ';' expr ';' expr ')' statement
+ ;
jump_statement
- : GOTO identifier ';'
- | CONTINUE ';'
- | BREAK ';'
- | RETURN ';'
- | RETURN expr ';'
- ;
+ : GOTO identifier ';'
+ | CONTINUE ';'
+ | BREAK ';'
+ | RETURN ';'
+ | RETURN expr ';'
+ ;
file
- : external_definition
- | file external_definition
- ;
+ : external_definition
+ | file external_definition
+ ;
external_definition
- : function_definition
- | declaration
- ;
+ : function_definition
+ | declaration
+ ;
function_definition
- : declarator function_body
- | declaration_specifiers declarator function_body
- ;
+ : declarator function_body
+ | declaration_specifiers declarator function_body
+ ;
function_body
- : compound_statement
- | declaration_list compound_statement
- ;
+ : compound_statement
+ | declaration_list compound_statement
+ ;
identifier
- : IDENTIFIER
- ;
+ : IDENTIFIER
+ ;
%%
#include <stdio.h>
@@ -429,7 +429,7 @@
void yyerror(char *s)
{
- fflush(stdout);
- printf("[%4d]: %s\n", column, yytext);
- printf("\n%*s\n%*s\n", column, "^", column, s);
+ fflush(stdout);
+ printf("[%4d]: %s\n", column, yytext);
+ printf("\n%*s\n%*s\n", column, "^", column, s);
}
--- a/parser/c_compiler/test/error.c
+++ b/parser/c_compiler/test/error.c
@@ -1,11 +1,12 @@
#include <stdio.h>
#include <stdlib.h>
-int main(int argc, char **argv)
+int main (int argc, char **argv)
{
- FILE *fp;
+ FILE *fp;
- printf ("Hello, world\n")
+ /* ERROR SEMICOLON IS MISSING */
+ printf ("Hello, world\n")
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
--- a/parser/c_compiler/test/test.c
+++ b/parser/c_compiler/test/test.c
@@ -1,11 +1,11 @@
#include <stdio.h>
#include <stdlib.h>
-int main(int argc, char **argv)
+int main (int argc, char **argv)
{
- FILE *fp;
+ FILE *fp;
- printf ("Hello, world\n");
+ printf ("Hello, world\n");
- return EXIT_SUCCESS;
+ return EXIT_SUCCESS;
}
--- a/parser/calc/Makefile
+++ b/parser/calc/Makefile
@@ -10,7 +10,7 @@
.SUFFIXES: .c .y .l
-.c.o:
+.c.o:
$(CC) -c $(CFLAGS) -I$(INCLUDE) $(CONFIG) $<
.y.c:
--- a/parser/calc/lexer.l
+++ b/parser/calc/lexer.l
@@ -4,20 +4,20 @@
*/
%{
- #include <stdio.h>
- #include "parser.h"
+ #include <stdio.h>
+ #include "parser.h"
%}
%%
-[0-9]+ { yylval = atoi(yytext); return DIGIT; }
-[a-zA-Z] { yylval = yytext[0]; return LETTER; }
-"+" { return PLUS; }
-"-" { return MINUS; }
-"*" { return MUL; }
-"/" { return DIV; }
-"("|")"|"=" { return yytext[0]; }
-[ \t]+ {}
-\n { return yytext[0]; }
-. { printf("FEHLER: %s\n", yytext); }
+[0-9]+ { yylval = atoi(yytext); return DIGIT; }
+[a-zA-Z] { yylval = yytext[0]; return LETTER; }
+"+" { return PLUS; }
+"-" { return MINUS; }
+"*" { return MUL; }
+"/" { return DIV; }
+"("|")"|"=" { return yytext[0]; }
+[ \t]+ {}
+\n { return yytext[0]; }
+. { printf("FEHLER: %s\n", yytext); }
%%
--- a/parser/calc/parser.y
+++ b/parser/calc/parser.y
@@ -21,66 +21,66 @@
%%
list:
- /* empty */
- | list stat '\n'
- | list error '\n' { yyerrok; };
+ /* empty */
+ | list stat '\n'
+ | list error '\n' { yyerrok; };
stat:
- expr { (void) printf( "RESULT: %d\n", $1 ); }
- | LETTER '=' expr { regs[$1] = $3; }
- ;
+ expr { (void) printf( "RESULT: %d\n", $1 ); }
+ | LETTER '=' expr { regs[$1] = $3; }
+ ;
expr:
- '(' expr ')'
- {
- $$ = $2;
- }
- | expr PLUS expr
- {
- $$ = $1 + $3;
- }
- | expr MINUS expr
- {
- $$ = $1 - $3;
- }
- | expr MUL expr
- {
- $$ = $1 * $3;
- }
- | expr DIV expr
- {
- $$ = $1 / $3;
- }
- | MINUS expr %prec UMINUS
- {
- $$ = -$2;
- }
- | LETTER
- {
- $$ = regs[$1];
- }
- | number
- ;
+ '(' expr ')'
+ {
+ $$ = $2;
+ }
+ | expr PLUS expr
+ {
+ $$ = $1 + $3;
+ }
+ | expr MINUS expr
+ {
+ $$ = $1 - $3;
+ }
+ | expr MUL expr
+ {
+ $$ = $1 * $3;
+ }
+ | expr DIV expr
+ {
+ $$ = $1 / $3;
+ }
+ | MINUS expr %prec UMINUS
+ {
+ $$ = -$2;
+ }
+ | LETTER
+ {
+ $$ = regs[$1];
+ }
+ | number
+ ;
number:
- DIGIT
- {
- $$ = $1; base = ($1==0) ? 8 : 10;
- }
- | number DIGIT
- {
- $$ = base * $1 + $2;
- }
- ;
+ DIGIT
+ {
+ $$ = $1; base = ($1==0) ? 8 : 10;
+ }
+ | number DIGIT
+ {
+ $$ = base * $1 + $2;
+ }
+ ;
%%
int yyerror()
{
- printf("ERROR\n");
- return 0;
+ printf("ERROR\n");
+ return 0;
}
int yywrap()
{
- return 1;
+ return 1;
}