-
Notifications
You must be signed in to change notification settings - Fork 1
/
parse.y
113 lines (94 loc) · 2.49 KB
/
parse.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* CS3377.501
* parse.y - Program 4
* Jonathan Lawrence
*/
%{
#include <stdio.h>
int yylex(void);
void yyerror(const char*);
%}
//creates union data structure
%union
{
int value;
char* str;
}
//allows for error catching
%define parse.error verbose
//tokens defined here
%token NAME
%token ID
%token NAME_INITIAL
%token ROMAN
%token SR
%token JR
%token EOL
%token INT
%token COMMA
%token DASH
%token HASH
//establishes connection between union and tokens
%type <value> INT
%type <str> NAME
%type <str> ID
%type <str> NAME_INITIAL
%type <str> ROMAN
%start Multiple_Addresses
%%
Multiple_Addresses:
Multiple_Addresses EOL Address
| Address
;
Address:
Name_Line EOL Street_Line EOL City_State_Line EOL
;
Name_Line:
Name
| Name Suffix
;
Street_Line:
House_Number Street_Name Apartment_Number
| House_Number Street_Name
;
City_State_Line:
City_Name COMMA State Zipcode
;
Name:
NAME_INITIAL NAME {fprintf(stderr, "<FirstName>%s</FirstName>\n<LastName>%s</LastName>\n", $1, $2);}
|NAME NAME {fprintf(stderr, "<FirstName>%s</FirstName>\n<LastName>%s</LastName>\n", $1, $2);}
;
Suffix:
JR {fprintf(stderr, "<Suffix>Jr.</Suffix>\n");}
|SR {fprintf(stderr, "<Suffix>Sr.</Suffix>\n");}
|ROMAN {fprintf(stderr, "<Suffix>%s</Suffix>\n", $1);}
;
House_Number:
ID {fprintf(stderr, "<HouseNumber>%s</HouseNumber>\n", $1);}
|INT {fprintf(stderr, "<HouseNumber>%d</HouseNumber>\n", $1);}
;
Street_Name:
NAME {fprintf(stderr, "<StreetName>%s</StreetName>\n", $1);}
|ID {fprintf(stderr, "<StreetName>%s</StreetName>\n", $1);}
;
Apartment_Number:
HASH INT {fprintf(stderr, "<AptNum>%d</AptNum>\n", $2);}
|INT {fprintf(stderr, "<AptNum>%d</AptNum>\n", $1);}
;
City_Name:
NAME {fprintf(stderr, "<City>%s</City>\n", $1);}
|ID {fprintf(stderr, "<City>%s</City>\n", $1);}
;
State:
ID {fprintf(stderr, "<State>%s</State>\n", $1);}
;
Zipcode:
INT DASH INT {fprintf(stderr, "<Zip5>%d</Zip5>\n<Zip4>%d</Zip4>\n\n", $1, $3);}
|INT {fprintf(stderr, "<Zip5>%d</Zip5>\n\n", $1);}
;
%%
//displays error message to stdout
void yyerror(const char* s){
fprintf(stdout, "%s\n", s);
}