📄 parser.cs
字号:
static void SimSet(out BitArray s) {
int n1, n2;
s = new BitArray(CharClass.charSetSize);
if (la.kind == 1) {
Get();
CharClass c = CharClass.Find(t.val);
if (c == null) SemErr("undefined name"); else s.Or(c.set);
} else if (la.kind == 3) {
Get();
string name = t.val;
name = DFA.Unescape(name.Substring(1, name.Length-2));
foreach (char ch in name)
if (DFA.ignoreCase) s[char.ToLower(ch)] = true;
else s[ch] = true;
} else if (la.kind == 5) {
Char(out n1);
s[n1] = true;
if (la.kind == 22) {
Get();
Char(out n2);
for (int i = n1; i <= n2; i++) s[i] = true;
}
} else if (la.kind == 23) {
Get();
s = new BitArray(CharClass.charSetSize, true);
} else SynErr(45);
}
static void Char(out int n) {
Expect(5);
string name = t.val; n = 0;
name = DFA.Unescape(name.Substring(1, name.Length-2));
int max = CharClass.charSetSize;
if (name.Length == 1 && name[0] <= max-1) n = name[0] % max;
else SemErr("unacceptable character value");
if (DFA.ignoreCase && (char)n >= 'A' && (char)n <= 'Z') n += 32;
}
static void Sym(out string name, out int kind) {
name = "???"; kind = id;
if (la.kind == 1) {
Get();
kind = id; name = t.val;
} else if (la.kind == 3 || la.kind == 5) {
if (la.kind == 3) {
Get();
name = t.val;
} else {
Get();
name = "\"" + t.val.Substring(1, t.val.Length-2) + "\"";
}
kind = str;
if (DFA.ignoreCase) name = name.ToLower();
if (name.IndexOf(' ') >= 0)
SemErr("literal tokens must not contain blanks");
} else SynErr(46);
}
static void Term(out Graph g) {
Graph g2; Node rslv = null; g = null;
if (StartOf(15)) {
if (la.kind == 35) {
rslv = new Node(Node.rslv, null, la.line);
Resolver(out rslv.pos);
g = new Graph(rslv);
}
Factor(out g2);
if (rslv != null) Graph.MakeSequence(g, g2);
else g = g2;
while (StartOf(16)) {
Factor(out g2);
Graph.MakeSequence(g, g2);
}
} else if (StartOf(17)) {
g = new Graph(new Node(Node.eps, null, 0));
} else SynErr(47);
if (g == null) // invalid start of Term
g = new Graph(new Node(Node.eps, null, 0));
}
static void Resolver(out Position pos) {
Expect(35);
Expect(28);
int beg = la.pos; int col = la.col;
Condition();
pos = new Position(beg, t.pos - beg, col);
}
static void Factor(out Graph g) {
string name; int kind; Position pos; bool weak = false;
g = null;
switch (la.kind) {
case 1: case 3: case 5: case 27: {
if (la.kind == 27) {
Get();
weak = true;
}
Sym(out name, out kind);
Symbol sym = Symbol.Find(name);
if (sym == null && kind == str)
sym = Tab.literals[name] as Symbol;
bool undef = sym == null;
if (undef) {
if (kind == id)
sym = new Symbol(Node.nt, name, 0); // forward nt
else if (genScanner) {
sym = new Symbol(Node.t, name, t.line);
DFA.MatchLiteral(sym.name, sym);
} else { // undefined string in production
SemErr("undefined string in production");
sym = Tab.eofSy; // dummy
}
}
int typ = sym.typ;
if (typ != Node.t && typ != Node.nt)
SemErr("this symbol kind is not allowed in a production");
if (weak)
if (typ == Node.t) typ = Node.wt;
else SemErr("only terminals may be weak");
Node p = new Node(typ, sym, t.line);
g = new Graph(p);
if (la.kind == 24) {
Attribs(p);
if (kind != id) SemErr("a literal must not have attributes");
}
if (undef)
sym.attrPos = p.pos; // dummy
else if ((p.pos == null) != (sym.attrPos == null))
SemErr("attribute mismatch between declaration and use of this symbol");
break;
}
case 28: {
Get();
Expression(out g);
Expect(29);
break;
}
case 30: {
Get();
Expression(out g);
Expect(31);
Graph.MakeOption(g);
break;
}
case 32: {
Get();
Expression(out g);
Expect(33);
Graph.MakeIteration(g);
break;
}
case 37: {
SemText(out pos);
Node p = new Node(Node.sem, null, 0);
p.pos = pos;
g = new Graph(p);
break;
}
case 23: {
Get();
Node p = new Node(Node.any, null, 0); // p.set is set in Tab.SetupAnys
g = new Graph(p);
break;
}
case 34: {
Get();
Node p = new Node(Node.sync, null, 0);
g = new Graph(p);
break;
}
default: SynErr(48); break;
}
if (g == null) // invalid start of Factor
g = new Graph(new Node(Node.eps, null, 0));
}
static void Attribs(Node p) {
Expect(24);
int beg = la.pos; int col = la.col;
while (StartOf(9)) {
// CHANGES BY M.KRUEGER
if (la.kind == 24) {
Attribs(p);
} else
// EOC
if (StartOf(10)) {
Get();
} else {
Get();
SemErr("bad string in attributes");
}
}
Expect(25);
if (t.pos > beg) p.pos = new Position(beg, t.pos - beg, col);
}
static void Condition() {
while (StartOf(18)) {
if (la.kind == 28) {
Get();
Condition();
} else {
Get();
}
}
Expect(29);
}
static void TokenTerm(out Graph g) {
Graph g2;
TokenFactor(out g);
while (StartOf(7)) {
TokenFactor(out g2);
Graph.MakeSequence(g, g2);
}
if (la.kind == 36) {
Get();
Expect(28);
TokenExpr(out g2);
Graph.SetContextTrans(g2.l); Graph.MakeSequence(g, g2);
Expect(29);
}
}
static void TokenFactor(out Graph g) {
string name; int kind;
g = null;
if (la.kind == 1 || la.kind == 3 || la.kind == 5) {
Sym(out name, out kind);
if (kind == id) {
CharClass c = CharClass.Find(name);
if (c == null) {
SemErr("undefined name");
c = new CharClass(name, new BitArray(CharClass.charSetSize));
}
Node p = new Node(Node.clas, null, 0); p.val = c.n;
g = new Graph(p);
tokenString = noString;
} else { // str
g = Graph.StrToGraph(name);
if (tokenString == null) tokenString = name;
else tokenString = noString;
}
} else if (la.kind == 28) {
Get();
TokenExpr(out g);
Expect(29);
} else if (la.kind == 30) {
Get();
TokenExpr(out g);
Expect(31);
Graph.MakeOption(g);
} else if (la.kind == 32) {
Get();
TokenExpr(out g);
Expect(33);
Graph.MakeIteration(g);
} else SynErr(49);
if (g == null) // invalid start of TokenFactor
g = new Graph(new Node(Node.eps, null, 0));
}
public static void Parse() {
la = new Token();
la.val = "";
Get();
Coco();
Expect(0);
}
static bool[,] set = {
{T,T,x,T, x,T,x,x, x,x,T,T, x,x,x,T, T,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x},
{x,T,T,T, T,T,T,x, x,x,x,x, T,T,T,x, x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x},
{T,T,x,T, x,T,x,x, x,x,T,T, x,x,x,T, T,T,T,x, x,x,x,T, x,x,T,T, T,x,T,x, T,x,T,T, x,T,x,x, x,x,x},
{T,T,x,T, x,T,x,x, x,x,T,T, x,x,x,T, T,T,x,T, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, x,T,x},
{T,T,x,T, x,T,x,x, x,x,T,T, x,x,x,T, T,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x},
{x,T,x,T, x,T,x,x, x,x,T,T, x,x,x,T, T,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,T,x,x, x,x,x},
{x,T,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, T,x,T,x, T,x,x,x, x,x,x,x, x,x,x},
{x,x,x,x, x,x,x,x, x,x,x,T, x,T,T,T, T,x,T,x, x,x,x,x, x,x,x,x, x,T,x,T, x,T,x,x, x,x,x,x, x,x,x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,x,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x},
{x,T,T,T, x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,x,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,x,T, T,T,x},
{x,T,T,T, x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,x,x,T, T,T,x},
{x,T,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,T, x,x,T,T, T,T,T,T, T,T,T,T, x,T,x,x, x,x,x},
{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,x, x,x,x,x, x,T,x,T, x,T,x,x, x,x,x,x, x,x,x},
{x,T,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, x,x,x,T, T,x,T,x, T,x,T,T, x,T,x,x, x,x,x},
{x,T,x,T, x,T,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,T, x,x,x,T, T,x,T,x, T,x,T,x, x,T,x,x, x,x,x},
{x,x,x,x, x,x,x,x, x,x,x,x, x,x,x,x, x,x,T,x, x,x,x,x, x,x,T,x, x,T,x,T, x,T,x,x, x,x,x,x, x,x,x},
{x,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,T,T,T, T,x,T,T, T,T,T,T, T,T,T,T, T,T,x}
};
} // end Parser
public class Errors {
public static int count = 0; // number of errors detected
public static string errMsgFormat = "-- line {0} col {1}: {2}"; // 0=line, 1=column, 2=text
public static void SynErr (int line, int col, int n) {
string s;
switch (n) {
case 0: s = "EOF expected"; break;
case 1: s = "ident expected"; break;
case 2: s = "number expected"; break;
case 3: s = "string expected"; break;
case 4: s = "badString expected"; break;
case 5: s = "char expected"; break;
case 6: s = "\"COMPILER\" expected"; break;
case 7: s = "\"IGNORECASE\" expected"; break;
case 8: s = "\"CHARACTERS\" expected"; break;
case 9: s = "\"TOKENS\" expected"; break;
case 10: s = "\"PRAGMAS\" expected"; break;
case 11: s = "\"COMMENTS\" expected"; break;
case 12: s = "\"FROM\" expected"; break;
case 13: s = "\"TO\" expected"; break;
case 14: s = "\"NESTED\" expected"; break;
case 15: s = "\"IGNORE\" expected"; break;
case 16: s = "\"PRODUCTIONS\" expected"; break;
case 17: s = "\"=\" expected"; break;
case 18: s = "\".\" expected"; break;
case 19: s = "\"END\" expected"; break;
case 20: s = "\"+\" expected"; break;
case 21: s = "\"-\" expected"; break;
case 22: s = "\"..\" expected"; break;
case 23: s = "\"ANY\" expected"; break;
case 24: s = "\"<\" expected"; break;
case 25: s = "\">\" expected"; break;
case 26: s = "\"|\" expected"; break;
case 27: s = "\"WEAK\" expected"; break;
case 28: s = "\"(\" expected"; break;
case 29: s = "\")\" expected"; break;
case 30: s = "\"[\" expected"; break;
case 31: s = "\"]\" expected"; break;
case 32: s = "\"{\" expected"; break;
case 33: s = "\"}\" expected"; break;
case 34: s = "\"SYNC\" expected"; break;
case 35: s = "\"IF\" expected"; break;
case 36: s = "\"CONTEXT\" expected"; break;
case 37: s = "\"(.\" expected"; break;
case 38: s = "\".)\" expected"; break;
case 39: s = "\"using\" expected"; break;
case 40: s = "\";\" expected"; break;
case 41: s = "??? expected"; break;
case 42: s = "this symbol not expected in Coco"; break;
case 43: s = "this symbol not expected in TokenDecl"; break;
case 44: s = "invalid TokenDecl"; break;
case 45: s = "invalid SimSet"; break;
case 46: s = "invalid Sym"; break;
case 47: s = "invalid Term"; break;
case 48: s = "invalid Factor"; break;
case 49: s = "invalid TokenFactor"; break;
default: s = "error " + n; break;
}
Console.WriteLine(Errors.errMsgFormat, line, col, s);
count++;
}
public static void SemErr (int line, int col, int n) {
Console.WriteLine(errMsgFormat, line, col, ("error " + n));
count++;
}
public static void Error (int line, int col, string s) {
Console.WriteLine(errMsgFormat, line, col, s);
count++;
}
public static void Exception (string s) {
Console.WriteLine(s);
System.Environment.Exit(1);
}
} // Errors
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -