-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSyn.g
More file actions
117 lines (91 loc) · 1.77 KB
/
Syn.g
File metadata and controls
117 lines (91 loc) · 1.77 KB
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
114
115
116
117
// COMS22303: Syntax analyser
parser grammar Syn;
options {
tokenVocab = Lex;
output = AST;
}
@members
{
int synErrors = 0;
private String cleanString(String s){
String tmp;
tmp = s.replaceAll("^'", "");
s = tmp.replaceAll("'$", "");
tmp = s.replaceAll("''", "'");
return tmp;
}
public void displayRecognitionError(String[] tokenNames, RecognitionException e)
{
synErrors++;
String hdr = getErrorHeader(e);
String msg = getErrorMessage(e, tokenNames);
System.out.println("Syn error: " + hdr + " " + msg);
}
public int getSynErrors()
{
return synErrors;
}
}
program :
compoundstatement
;
compoundstatement :
BEGIN^ ( statement SEMICOLON! )* END!
;
statement :
variable ASSIGN^ expression
| READ^ OPENPAREN! variable CLOSEPAREN!
| REPEAT^ compoundstatement UNTIL! booltype
| WHILE^ booltype compoundstatement
| IF^ booltype
compoundstatement
(ELSE!
compoundstatement)?
| WRITE^ OPENPAREN! ( expression | string ) CLOSEPAREN!
| WRITELN^
;
relation :
GREATER
| LESSER
| EQUALS
| DEQUALS
| GEQUALS
| LEQUALS
;
booltype :
expression relation^ expression
;
expression:
//(PLUS! | MINUS^)? term ( (PLUS | MINUS)^ term )*
unaryop ((PLUS^ | MINUS^) term)*
;
pmterm:
( PLUS^ | MINUS^ ) term
;
unaryop
: PLUS! term
| MINUS term -> ^(MINUS REALNUM["0.0"] term)
| term
;
term :
factor ( ( TIMES^ | DIVIDE^ ) factor )*
;
constant:
REALNUM
;
variable:
identifier
;
identifier:
IDENT
;
factor :
variable
| constant
| OPENPAREN! expression CLOSEPAREN!
;
string
scope { String tmp;}
:
s=STRING { $string::tmp = cleanString($s.text); }-> STRING[$string::tmp]
;