-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCoco.ts
136 lines (114 loc) · 5.04 KB
/
Coco.ts
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*-------------------------------------------------------------------------
Compiler Generator Coco/R,
Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
extended by M. Loeberbauer & A. Woess, University of Linz
ported from C# to Java by Wolfgang Ahorner
with improvements by Pat Terry, Rhodes University
ported from Java to Typescript by Stefan Kempinger, University of Linz
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
As an exception, it is allowed to write an extension of Coco/R that is
used as a plugin in non-free software.
If not otherwise stated, any source code generated by Coco/R (other than
Coco/R itself) does not fall under the GNU General Public License.
------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------
Trace output options
0 | A: prints the states of the scanner automaton
1 | F: prints the First and Follow sets of all nonterminals
2 | G: prints the syntax graph of the productions
3 | I: traces the computation of the First sets
4 | J: prints the sets associated with ANYs and synchronisation sets
6 | S: prints the symbol table (terminals, nonterminals, pragmas)
7 | X: prints a cross reference list of all syntax symbols
8 | P: prints statistics about the Coco run
Trace output can be switched on by the pragma
$ { digit | letter }
in the attributed grammar or as a command-line option
-------------------------------------------------------------------------*/
import {Tab} from "./Tab";
import {DFA} from "./DFA";
import {Trace} from "./Trace";
import {ParserGen} from "./ParserGen";
import {Parser} from "./Parser";
import {Scanner} from "./Scanner";
import * as path from "path";
// let t0:Date,t1:Date,t2:Date,t3:Date,t4:Date
// t0 = new Date()
console.log("Coco/R (Apr 20, 2022)");
let srcName = undefined, nsName = undefined, frameDir = undefined, ddtString = undefined, outDir = undefined;
let retVal = 1;
for (let i = 2; i < process.argv.length; i++) {
if (process.argv[i] == "-package" && i < process.argv.length - 1) nsName = process.argv[++i].trim();
else if (process.argv[i] == "-frames" && i < process.argv.length - 1) frameDir = process.argv[++i].trim();
else if (process.argv[i] == "-trace" && i < process.argv.length - 1) ddtString = process.argv[++i].trim();
else if (process.argv[i] == "-o" && i < process.argv.length - 1) outDir = process.argv[++i].trim();
else srcName = process.argv[i];
}
// t1 = new Date()
if (process.argv.length > 2 && srcName != undefined) {
try {
//new File(srcName).getParent();
let srcDir = path.basename(path.dirname(srcName));
let scanner = new Scanner(srcName);
let parser = new Parser(scanner);
parser.trace = new Trace(srcDir);
parser.tab = new Tab(parser);
parser.dfa = new DFA(parser);
parser.pgen = new ParserGen(parser);
parser.tab.srcName = srcName;
parser.tab.srcDir = srcDir;
parser.tab.nsName = nsName;
parser.tab.frameDir = frameDir;
parser.tab.outDir = (outDir != undefined) ? outDir : srcDir;
if (ddtString != undefined) parser.tab.SetDDT(ddtString);
// t2 = new Date()
parser.Parse();
// t3 = new Date()
parser.trace.Close();
console.log(parser.errors.count + " errors detected");
if (parser.errors.count == 0) {
retVal = 0;
}
} catch (e) {
console.log(e);
}
} else {
console.log(
"Usage: Coco Grammar.ATG {Option}\n" +
"Options:\n" +
" -package <packageName>\n" +
" -frames <frameFilesDirectory>\n" +
" -trace <traceString>\n" +
" -o <outputDirectory>\n" +
"Valid characters in the trace string:\n" +
" A trace automaton\n" +
" F list first/follow sets\n" +
" G print syntax graph\n" +
" I trace computation of first sets\n" +
" J list ANY and SYNC sets\n" +
" P print statistics\n" +
" S list symbol table\n" +
" X list cross reference table\n" +
"Scanner.frame and Parser.frame files needed in ATG directory\n" +
"or in a directory specified in the -frames option.\n"
);
retVal = 0;
}
// t4=new Date()
//
// // @ts-ignore
// console.log(`Time Taken to execute = ${(t4 - t0)} ms`)
// // @ts-ignore
// console.log(`Time Taken to parse = ${(t3 - t2)} ms`)
process.exit(retVal);
// end Coco