N88BASICが簡単に動くインタープリタを目指します。
@@ -8,13 +8,15 @@ | ||
8 | 8 | { |
9 | 9 | enum TokenType { |
10 | 10 | int_value,double_value, str_value |
11 | - ,ab_if,ab_else,ab_end_if,ab_then, | |
12 | - ab_for,ab_to,ab_step,ab_next, | |
11 | + ,ab_if,ab_else,ab_end,ab_then, | |
12 | + ab_for,ab_to,ab_step,ab_next, ab_exit, | |
13 | + abn88_print, abn88_line, | |
13 | 14 | identifier, |
14 | 15 | Plus, Minus, Mult, Div,Equal,// +-*/= |
15 | 16 | Lparen, Rparen,//() |
16 | 17 | LBrace, RBrace,//{} |
17 | 18 | Comma, Period,//,. |
19 | + DoubleQuote,//" | |
18 | 20 | Lss, Gtr,// < > |
19 | 21 | Letter, Digit, Colon, Others, |
20 | 22 | EndOfFile |
@@ -22,7 +24,6 @@ | ||
22 | 24 | class Token |
23 | 25 | { |
24 | 26 | TokenType tokenType; |
25 | - string value_cs_str; | |
26 | 27 | int src_line; |
27 | 28 | int src_col; |
28 | 29 | string src_str; |
@@ -11,9 +11,39 @@ | ||
11 | 11 | { |
12 | 12 | private int src_line; |
13 | 13 | private int src_col; |
14 | + private string src_str; | |
14 | 15 | |
15 | - TokenType getCharType(char chr) | |
16 | + private Dictionary<string, TokenType> keywordDic; | |
17 | + | |
18 | + public TokenGetter() | |
16 | 19 | { |
20 | + keywordDic = new Dictionary<string, TokenType>(); | |
21 | + //予約語 | |
22 | + rKWD("if", ab_if); | |
23 | + rKWD("then", ab_then); | |
24 | + rKWD("end",ab_end); | |
25 | + rKWD("next", ab_next); | |
26 | + rKWD("for", ab_for); | |
27 | + rKWD("to", ab_to); | |
28 | + rKWD("step", ab_step); | |
29 | + rKWD("print", abn88_print); | |
30 | + rKWD("line", abn88_line); | |
31 | + curChar = Console.Read(); | |
32 | + } | |
33 | + /// <summary> | |
34 | + /// Regist Key Word Dictionary | |
35 | + /// </summary> | |
36 | + void rKWD(string str, TokenType t) | |
37 | + { | |
38 | + keywordDic.Add(str, t); | |
39 | + } | |
40 | + TokenType getCurCharType() | |
41 | + { | |
42 | + return getCharType(curChar); | |
43 | + } | |
44 | + TokenType getCharType(int c) | |
45 | + { | |
46 | + char chr = (char)c; | |
17 | 47 | if (chr >= '0' && chr <= '9') |
18 | 48 | return Digit; |
19 | 49 | if ((chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z')) |
@@ -34,7 +64,8 @@ | ||
34 | 64 | case '>': return Gtr; |
35 | 65 | case ',': return Comma; |
36 | 66 | case '.': return Period; |
37 | -// case ';': return Semicolon; | |
67 | + case '"': return DoubleQuote; | |
68 | + case ';': return EndOfFile;//test用 Semicolon; | |
38 | 69 | case ':': return Colon; |
39 | 70 | default: |
40 | 71 | break; |
@@ -44,11 +75,15 @@ | ||
44 | 75 | |
45 | 76 | |
46 | 77 | } |
47 | - int NextChar() | |
78 | + int curChar = 0; | |
79 | + void NextChar() | |
48 | 80 | { |
49 | - var c = Console.Read(); | |
50 | - if (c == '\n') | |
81 | + | |
82 | + add_char_to_src_str(curChar); | |
83 | + curChar = Console.Read(); | |
84 | + if (curChar == '\n') | |
51 | 85 | { |
86 | + | |
52 | 87 | src_line++; |
53 | 88 | src_col = 0; |
54 | 89 | } |
@@ -56,26 +91,83 @@ | ||
56 | 91 | { |
57 | 92 | src_col++; |
58 | 93 | } |
59 | - return c; | |
60 | 94 | } |
61 | - public Token NextToken() | |
95 | + | |
96 | + | |
97 | + public TokenType NextTokenType() | |
62 | 98 | { |
63 | - int c = NextChar(); | |
64 | - while (true) | |
99 | + while (curChar == ' ' || curChar == '\t') | |
65 | 100 | { |
66 | - if (c == ' ' || c == '\t') | |
67 | - { | |
68 | - ; | |
69 | - } | |
70 | - else | |
71 | - { | |
72 | - break; | |
73 | - } | |
74 | - c = NextChar(); | |
101 | + NextChar(); | |
102 | + } | |
103 | + src_str = String.Empty; | |
104 | + if (curChar == '\n') | |
105 | + { | |
106 | + src_str = "\\n"; | |
107 | + } | |
108 | + if (curChar == '\r') | |
109 | + { | |
110 | + src_str = "\\r"; | |
111 | + } | |
112 | + var t = getCurCharType(); | |
113 | + NextChar(); | |
114 | + switch (t) | |
115 | + { | |
116 | + case Letter: | |
117 | + while (getCurCharType() == Letter || getCurCharType() == Digit) | |
118 | + { | |
119 | + NextChar(); | |
120 | + } | |
121 | + foreach (var p in keywordDic)//予約語検索 | |
122 | + { | |
123 | + if(string.Compare(p.Key, src_str, true) == 0) | |
124 | + { | |
125 | + return p.Value; | |
126 | + } | |
127 | + } | |
128 | + return identifier; | |
129 | + case Digit: | |
130 | + while(getCurCharType() == Digit) | |
131 | + { | |
132 | + NextChar(); | |
133 | + } | |
134 | + if (getCurCharType() != Period) | |
135 | + { | |
136 | + return int_value; | |
137 | + } | |
138 | + else | |
139 | + { | |
140 | + NextChar(); | |
141 | + while(getCurCharType() == Digit) | |
142 | + { | |
143 | + NextChar(); | |
144 | + } | |
145 | + return double_value; | |
146 | + } | |
147 | + case DoubleQuote: | |
148 | + while(!( | |
149 | + getCurCharType() == DoubleQuote || | |
150 | + getCurCharType() == EndOfFile)) | |
151 | + { | |
152 | + NextChar(); | |
153 | + } | |
154 | + if (getCurCharType() == DoubleQuote) | |
155 | + { | |
156 | + NextChar(); | |
157 | + } | |
158 | + return str_value; | |
75 | 159 | |
76 | 160 | } |
77 | - var t = getCharType((char)c); | |
78 | - return new Token(c.ToString(),src_line,src_col, t); | |
161 | + return t; | |
79 | 162 | } |
163 | + public Token NextToken() | |
164 | + { | |
165 | + var t = NextTokenType(); | |
166 | + return new Token(src_str, src_line, src_col, t); | |
167 | + } | |
168 | + private void add_char_to_src_str(int c) | |
169 | + { | |
170 | + src_str += ((char)c).ToString(); | |
171 | + } | |
80 | 172 | } |
81 | 173 | } |
@@ -0,0 +1,12 @@ | ||
1 | +using System; | |
2 | +using System.Collections.Generic; | |
3 | +using System.Linq; | |
4 | +using System.Text; | |
5 | +using System.Threading.Tasks; | |
6 | + | |
7 | +namespace getToken | |
8 | +{ | |
9 | + class Utils | |
10 | + { | |
11 | + } | |
12 | +} |