-
Notifications
You must be signed in to change notification settings - Fork 0
/
Token.cs
145 lines (129 loc) · 3.01 KB
/
Token.cs
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
137
138
139
140
141
142
143
144
145
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace mima_c
{
enum TokenType
{
UNDEFINED,
EOS,
BOS,
INTLITERAL,
LPAREN,
RPAREN,
PLUS,
MINUS,
DIVIDE,
STAR,
MODULO,
IDENTIFIER,
SEMICOLON,
ASSIGN,
COMMA,
LBRACE,
RBRACE,
FOR,
WHILE,
IF,
ELSE,
INTRINSIC,
RETURN,
STRINGLITERAL,
CHARLITERAL,
LT,
GT,
GEQ,
LEQ,
EQ,
NEQ,
BREAK,
CONTINUE,
LBRACKET,
RBRACKET,
AMPERSAND,
PLUSPLUS,
MINUSMINUS,
QUESTIONMARK,
COLON,
AND,
OR,
DOT,
ARROW,
NOT,
LNOT,
DIVIDEEQ,
MODULOEQ,
STAREQ,
MINUSEQ,
PLUSEQ,
STRUCT,
TYPEDEF,
}
internal class Pos
{
public int line { get; }
public int character { get; }
public Pos(int line, int character)
{
this.line = line;
this.character = character;
}
public override string ToString()
{
return "(" + line + ", " + character + ")";
}
}
class Token
{
public Pos pos { get; }
public TokenType tokenType { get; }
public string value { get; set; }
public Token() : this(TokenType.EOS)
{
}
public Token(TokenType tokenType, Pos pos = null, string value = null)
{
this.tokenType = tokenType;
this.pos = pos;
this.value = value;
}
public override string ToString()
{
if (value != null)
return "{0}({1})".Format(tokenType.ToString().Replace("TokenType.", ""), value.ToString());
else
return tokenType.ToString().Replace("TokenType.", "");
}
}
internal class TokenStream
{
public List<Token> tokens { get; set; }
public TokenStream(List<Token> tokens)
{
this.tokens = tokens;
}
public Token Eat(TokenType expectedTokenType)
{
Token nextToken = tokens.FirstOrDefault();
if (nextToken.tokenType != expectedTokenType)
{
Console.WriteLine("{0}: Tried to eat: {1} but has: {2}".Format(nextToken.pos, expectedTokenType, nextToken.tokenType));
Console.WriteLine("Leftover Tokenstream:");
Console.WriteLine(ToString());
Debug.Assert(false);
Environment.Exit(1);
}
tokens.RemoveAt(0);
return nextToken;
}
public Token Peek(int n = 0)
{
return tokens.Count <= n ? new Token() : tokens[n];
}
public override string ToString()
{
return "[" + tokens.FormatList() + "]";
}
}
}