Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %{
- #include <stdio.h>
- #include <stdlib.h>
- /* Some constants. */
- /* These constants are used later in the code */
- #define SYMTABSIZE 50
- #define IDLENGTH 15
- #define NOTHING -1
- #define INDENTOFFSET 2
- enum ParseTreeNodeType {PROGRAM, BLOCK, ID_VALUE, NUMBER_VALUE, DECLARATION_BLOCK, STATEMENT_LIST, FOR_STATEMENT,
- STATEMENT, IDENTIFIER_LIST, ASSIGNMENT_STATEMENT, IF_STATEMENT, READ_STATEMENT, OUTPUT_LIST, CONDITIONAL, NUMBER_CONSTANT,
- DO_STATEMENT, WHILE_STATEMENT, WRITE_STATEMENT, CONDITIONAL_CONDITION, COMPARATOR, EXPRESSION, TERM, VALUE, CONSTANT, TYPENODE,
- MINUS_CONSTANT, REAL_CONSTANT, MINUSREAL_CONSTANT};
- char *NodeName[] = {"PROGRAM", "BLOCK", "ID_VALUE", "NUMBER_VALUE", "DECLARATION_BLOCK", "STATEMENT_LIST", "FOR_STATEMENT",
- "STATEMENT", "IDENTIFIER_LIST", "ASSIGNMENT_STATEMENT", "IF_STATEMENT", "READ_STATEMENT", "OUTPUT_LIST", "CONDITIONAL", "NUMBER_CONSTANT",
- "DO_STATEMENT", "WHILE_STATEMENT", "WRITE_STATEMENT", "CONDITIONAL_CONDITION", "COMPARATOR", "EXPRESSION", "TERM", "VALUE", "CONSTANT", "TYPENODE",
- "MINUS_CONSTANT", "REAL_CONSTANT", "MINUSREAL_CONSTANT"};
- #ifndef TRUE
- #define TRUE 1
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef NULL
- #define NULL 0
- #endif
- /* ------------- parse tree definition --------------------------- */
- struct treeNode {
- int item;
- int nodeIdentifier;
- struct treeNode *first;
- struct treeNode *second;
- struct treeNode *third;
- };
- typedef struct treeNode TREE_NODE;
- typedef TREE_NODE *TERNARY_TREE;
- /* ------------- forward declarations --------------------------- */
- int evaluate(TERNARY_TREE);
- TERNARY_TREE create_node(int,int,TERNARY_TREE,TERNARY_TREE,TERNARY_TREE);
- void PrintTree(TERNARY_TREE);
- void CodeTree(TERNARY_TREE);
- /* ------------- symbol table definition --------------------------- */
- struct symTabNode {
- char identifier[IDLENGTH];
- };
- typedef struct symTabNode SYMTABNODE;
- typedef SYMTABNODE *SYMTABNODEPTR;
- SYMTABNODEPTR symTab[SYMTABSIZE];
- int currentSymTabSize = 0;
- %}
- /****************/
- /* Start symbol */
- /****************/
- %start program
- /**********************/
- /* Action value types */
- /**********************/
- %union
- {
- int iVal;
- TERNARY_TREE tVal;
- }
- %token OF SEMICOLON COLON DECLARATIONS AND BY TO IS IF ENDIF THEN ELSE WHILE ENDWHILE DO ENDDO
- %token RIGHT NEWLINE READ WRITE TYPE OR FOR ENDFOR NOT CODE DECLARATION INTEGER REAL CHARACTER
- %token DIGIT LBRACKET RBRACKET FULLSTOP COMMA SINGLEQUOTE EQUALS TIMES DIVIDE PLUS MINUS LT GT
- %token LTET GTET NOTEQUALS ENDP ASSIGNMENT
- %token<iVal> ID NUMBER REALCONSTANT CHARCONSTANT
- %type<tVal> program block declaration_block statement_list identifier_list statement type assignment_statement if_statement
- %type<tVal> do_statement for_statement write_statement read_statement output_list conditional conditional_condition comparator
- %type<tVal> expression term value constant number_constant while_statement
- %%
- /* For tree rules, TOKEN = NOTHING */
- program: ID COLON block ENDP ID FULLSTOP
- { TERNARY_TREE ParseTree;
- ParseTree = create_node($1, PROGRAM, $3, NULL, NULL);
- #ifdef DEBUG
- PrintTree(ParseTree);
- #else
- CodeTree(ParseTree);
- #endif
- }
- block: DECLARATIONS declaration_block CODE statement_list
- {
- $$ = create_node(NOTHING,BLOCK,$2,NULL,$4);
- }
- | CODE statement_list
- {
- $$ = create_node(NOTHING,BLOCK,$2,NULL,NULL);
- }
- ;
- identifier_list: ID
- {
- $$ = create_node($1, IDENTIFIER_LIST, NULL, NULL, NULL);
- }
- | ID COMMA identifier_list
- {
- $$ = create_node($1, IDENTIFIER_LIST, $3, NULL, NULL);
- }
- ;
- declaration_block: identifier_list OF TYPE type SEMICOLON
- {
- $$ = create_node(NOTHING, DECLARATION_BLOCK, $1, NULL, $4);
- }
- | declaration_block identifier_list OF TYPE type SEMICOLON
- {
- $$ = create_node(NOTHING, DECLARATION_BLOCK, $1, $2, NULL);
- }
- ;
- type: CHARACTER
- {
- $$ = create_node(NOTHING, TYPENODE, NULL, NULL, NULL);
- }
- | INTEGER
- {
- $$ = create_node(NOTHING, TYPENODE, NULL, NULL, NULL);
- }
- | REAL
- {
- $$ = create_node(NOTHING, TYPENODE, NULL, NULL, NULL);
- }
- ;
- statement_list: statement
- {
- $$ = create_node(NOTHING,STATEMENT_LIST,$1,NULL,NULL);
- }
- |statement SEMICOLON statement_list
- {
- $$ = create_node(NOTHING, STATEMENT_LIST, $1, $3, NULL);
- }
- ;
- statement: assignment_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- |if_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- |do_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- |while_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- |for_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- |write_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- |read_statement
- {
- $$ = create_node(NOTHING,STATEMENT,$1,NULL,NULL);
- }
- ;
- assignment_statement: expression ASSIGNMENT ID
- {
- $$ = create_node($3, ASSIGNMENT_STATEMENT,$1,NULL,NULL);
- }
- ;
- if_statement: IF conditional THEN statement_list ENDIF
- {
- $$ = create_node(NOTHING,IF_STATEMENT,$2,NULL,$4);
- }
- | IF conditional THEN statement_list ELSE statement_list ENDIF
- {
- $$ = create_node(NOTHING,IF_STATEMENT,$2,$4,$6);
- }
- ;
- do_statement: DO statement_list WHILE conditional ENDDO
- {
- $$ = create_node(NOTHING,DO_STATEMENT,$2,$4,NULL);
- }
- while_statement: WHILE conditional DO statement_list ENDWHILE
- {
- $$ = create_node(NOTHING,WHILE_STATEMENT,$2,$4,NULL);
- }
- for_statement: FOR ID IS expression BY expression TO expression DO statement_list ENDFOR
- {
- $$ = create_node($2,FOR_STATEMENT,$4,$6,$10);
- }
- write_statement: WRITE LBRACKET output_list RBRACKET
- {
- $$ = create_node(NOTHING,WRITE_STATEMENT,$3,NULL,NULL);
- }
- | NEWLINE
- {
- $$ = create_node(NOTHING,WRITE_STATEMENT,NULL,NULL,NULL);
- }
- ;
- read_statement: READ LBRACKET ID RBRACKET
- {
- $$ = create_node($3,READ_STATEMENT,NULL,NULL,NULL);
- }
- ;
- output_list: value
- {
- $$ = create_node(NOTHING,OUTPUT_LIST,$1,NULL,NULL);
- }
- | value COMMA output_list
- {
- $$ = create_node(NOTHING,OUTPUT_LIST,$1,$3,NULL);
- }
- ;
- conditional: conditional_condition
- {
- $$ = create_node(NOTHING,CONDITIONAL,$1,NULL,NULL);
- }
- | conditional AND conditional_condition
- {
- $$ = create_node(NOTHING,CONDITIONAL,$1,$3,NULL);
- }
- | conditional OR conditional_condition
- {
- $$ = create_node(NOTHING,CONDITIONAL,$1,$3,NULL);
- }
- ;
- conditional_condition : expression comparator expression
- {
- $$ = create_node(NOTHING,CONDITIONAL_CONDITION,$1,$2,$3);
- }
- | NOT conditional_condition
- {
- $$ = create_node(NOTHING,CONDITIONAL_CONDITION,$2,NULL,NULL);
- }
- ;
- comparator: EQUALS
- {
- $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
- }
- | NOTEQUALS
- {
- $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
- }
- | LT
- {
- $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
- }
- | GT
- {
- $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
- }
- | LTET
- {
- $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
- }
- | GTET
- {
- $$ = create_node(NOTHING,COMPARATOR,NULL,NULL,NULL);
- }
- ;
- expression: term
- {
- $$ = create_node(NOTHING,EXPRESSION,$1,NULL,NULL);
- }
- | expression PLUS term
- {
- $$ = create_node(NOTHING,EXPRESSION,$1,$3,NULL);
- }
- | expression MINUS term
- {
- $$ = create_node(NOTHING,EXPRESSION,$1,$3,NULL);
- }
- ;
- term: value
- {
- $$ = create_node(NOTHING,TERM,$1,NULL,NULL);
- }
- | term TIMES value
- {
- $$ = create_node(NOTHING,TERM,$1,$3,NULL);
- }
- | term DIVIDE value
- {
- $$ = create_node(NOTHING,TERM,$1,$3,NULL);
- }
- ;
- value: ID
- {
- $$ = create_node($1,VALUE,NULL,NULL,NULL);
- }
- | constant
- {
- $$ = create_node(NOTHING,VALUE,$1,NULL,NULL);
- }
- | LBRACKET expression RBRACKET
- {
- $$ = create_node(NOTHING,VALUE,$2,NULL,NULL);
- }
- ;
- constant: number_constant
- {
- $$ = create_node(NOTHING,CONSTANT,$1,NULL,NULL);
- }
- | CHARCONSTANT
- {
- $$ = create_node($1,CONSTANT,NULL,NULL,NULL);
- }
- ;
- number_constant: NUMBER
- {
- $$ = create_node($1,NUMBER_CONSTANT,NULL,NULL,NULL);
- }
- | MINUS NUMBER
- {
- $$ = create_node($2,MINUS_CONSTANT,NULL,NULL,NULL);
- }
- | REALCONSTANT
- {
- $$ = create_node($1,REAL_CONSTANT,NULL,NULL,NULL);
- }
- | MINUS REALCONSTANT
- {
- $$ = create_node($2,MINUSREAL_CONSTANT,NULL,NULL,NULL);
- }
- ;
- %%
- /* Code for routines for managing the Parse Tree */
- TERNARY_TREE create_node(int ival, int case_identifier, TERNARY_TREE p1,
- TERNARY_TREE p2, TERNARY_TREE p3)
- {
- TERNARY_TREE t;
- t = (TERNARY_TREE)malloc(sizeof(TREE_NODE));
- t->item = ival;
- t->nodeIdentifier = case_identifier;
- t->first = p1;
- t->second = p2;
- t->third = p3;
- return (t);
- }
- void PrintTree(TERNARY_TREE t)
- {
- if (t == NULL) return;
- if (t->item != NOTHING)
- {
- if (t->nodeIdentifier == NUMBER_CONSTANT || t->nodeIdentifier == MINUS_CONSTANT)
- printf("Number: %d ", t->item);
- else if (t->nodeIdentifier == VALUE || t->nodeIdentifier == READ_STATEMENT
- || t->nodeIdentifier == FOR_STATEMENT || t->nodeIdentifier == ASSIGNMENT_STATEMENT
- || t->nodeIdentifier == REAL_CONSTANT || t->nodeIdentifier == MINUSREAL_CONSTANT)
- printf("Identifier: %s\n", symTab[t->item]->identifier);
- }
- if (t->nodeIdentifier < 0 || t ->nodeIdentifier > sizeof(NodeName))
- printf("Unknown NodeIdentifier: %d\n",t->nodeIdentifier);
- else
- printf("NodeIdentifier: %s\n",NodeName[t->nodeIdentifier]);
- PrintTree(t->first);
- PrintTree(t->second);
- PrintTree(t->third);
- }
- void CodeTree(TERNARY_TREE t)
- {
- if (t == NULL) return;
- switch(t->nodeIdentifier)
- {
- case PROGRAM:
- printf("#include <stdio.h>\nint main(void)\n{\n");
- CodeTree(t->first);
- printf("}\n");
- break;
- case WRITE_STATEMENT:
- printf("printf(");
- if (t->first == NULL) printf("\"\\n\"");
- else
- {
- printf("\"");
- CodeTree(t->first);
- printf("\"");
- }
- printf(");\n");
- break;
- case CONSTANT:
- if (t->first == NULL) printf("%c",t->item);
- else
- CodeTree(t->first);
- break;
- default:
- CodeTree(t->first);
- CodeTree(t->second);
- CodeTree(t->third);
- }
- }
- #include "lex.yy.c"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement