📄 parser.frame
字号:
import java.util.*;
class Parser {
-->constants
private static final boolean T = true;
private static final boolean x = false;
private static final int minErrDist = 2;
private static int errDist = minErrDist;
static Token token; // last recognized token
static Token t; // lookahead token
-->declarations
static void Error(int n) {
if (errDist >= minErrDist) Scanner.err.ParsErr(n, t.line, t.col);
errDist = 0;
}
static void SemError(int n) {
if (errDist >= minErrDist) Scanner.err.SemErr(n, token.line, token.col);
errDist = 0;
}
static boolean Successful() {
return Scanner.err.count == 0;
}
static String LexString() {
return token.str;
}
static String LexName() {
return token.val;
}
static String LookAheadString() {
return t.str;
}
static String LookAheadName() {
return t.val;
}
private static void Get() {
for (;;) {
token = t;
t = Scanner.Scan();
if (t.kind <= maxT) {errDist++; return;}
-->pragmas
t = token;
}
}
private static void Expect(int n) {
if (t.kind == n) Get(); else Error(n);
}
private static boolean StartOf(int s) {
return set[s][t.kind];
}
private static void ExpectWeak(int n, int follow) {
if (t.kind == n) Get();
else {
Error(n);
while (!StartOf(follow)) Get();
}
}
private static boolean WeakSeparator(int n, int syFol, int repFol) {
boolean[] s = new boolean[maxT+1];
if (t.kind == n) {Get(); return true;}
else if (StartOf(repFol)) return false;
else {
for (int i = 0; i <= maxT; i++) {
s[i] = set[syFol][i] || set[repFol][i] || set[0][i];
}
Error(n);
while (!s[t.kind]) Get();
return StartOf(syFol);
}
}
-->productions
static void Parse() {
t = new Token();
Get();
-->parseRoot
}
private static boolean[][] set = {
-->initialization
};
}
-->ErrorStream
class ErrorStream {
int count; // number of errors detected
ErrorStream() {
count = 0;
}
void StoreError(int n, int line, int col, String s) {
System.out.println("-- line " + line + " col " + col + ": " + s);
}
void ParsErr(int n, int line, int col) {
String s;
count++;
switch (n) {
-->errors
default: s = "Syntax error " + n;
}
StoreError(n, line, col, s);
}
void SemErr(int n, int line, int col) {
String s;
count++;
switch (n) {
case -1: {s = "invalid character"; break;}
// perhaps insert application specific error messages here
default: {s = "Semantic error " + n; break;}
}
StoreError(n, line, col, s);
}
void Exception (String s) {
System.out.println(s); System.exit(0);
}
void Summarize (String s) {
switch (count) {
case 0 : System.out.println("No errors detected"); break;
case 1 : System.out.println("1 error detected"); break;
default: System.out.println(count + " errors detected"); break;
}
}
}
$$$
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -