N88BASICが簡単に動くインタープリタを目指します。
@@ -0,0 +1,21 @@ | ||
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 Program | |
10 | + { | |
11 | + static void Main(string[] args) | |
12 | + { | |
13 | + var tg = new TokenGetter(); | |
14 | + var token = tg.NextToken(); | |
15 | + while (!token.isEof()) { | |
16 | + Console.WriteLine(token.ToString()); | |
17 | + token = tg.NextToken(); | |
18 | + } | |
19 | + } | |
20 | + } | |
21 | +} |
@@ -0,0 +1,36 @@ | ||
1 | +using System.Reflection; | |
2 | +using System.Runtime.CompilerServices; | |
3 | +using System.Runtime.InteropServices; | |
4 | + | |
5 | +// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 | |
6 | +// アセンブリに関連付けられている情報を変更するには、 | |
7 | +// これらの属性値を変更してください。 | |
8 | +[assembly: AssemblyTitle("getToken")] | |
9 | +[assembly: AssemblyDescription("")] | |
10 | +[assembly: AssemblyConfiguration("")] | |
11 | +[assembly: AssemblyCompany("")] | |
12 | +[assembly: AssemblyProduct("getToken")] | |
13 | +[assembly: AssemblyCopyright("Copyright © 2018")] | |
14 | +[assembly: AssemblyTrademark("")] | |
15 | +[assembly: AssemblyCulture("")] | |
16 | + | |
17 | +// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから | |
18 | +// 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、 | |
19 | +// その型の ComVisible 属性を true に設定してください。 | |
20 | +[assembly: ComVisible(false)] | |
21 | + | |
22 | +// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります | |
23 | +[assembly: Guid("0e8234cf-c593-4b60-8f25-c79eb143c837")] | |
24 | + | |
25 | +// アセンブリのバージョン情報は次の 4 つの値で構成されています: | |
26 | +// | |
27 | +// メジャー バージョン | |
28 | +// マイナー バージョン | |
29 | +// ビルド番号 | |
30 | +// Revision | |
31 | +// | |
32 | +// すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます | |
33 | +// 既定値にすることができます: | |
34 | +// [assembly: AssemblyVersion("1.0.*")] | |
35 | +[assembly: AssemblyVersion("1.0.0.0")] | |
36 | +[assembly: AssemblyFileVersion("1.0.0.0")] |
@@ -0,0 +1,45 @@ | ||
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 | + enum TokenType { | |
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, | |
13 | + identifier, | |
14 | + Plus, Minus, Mult, Div,Equal,// +-*/= | |
15 | + Lparen, Rparen,//() | |
16 | + LBrace, RBrace,//{} | |
17 | + Comma, Period,//,. | |
18 | + Lss, Gtr,// < > | |
19 | + Letter, Digit, Colon, Others, | |
20 | + EndOfFile | |
21 | + } | |
22 | + class Token | |
23 | + { | |
24 | + TokenType tokenType; | |
25 | + string value_cs_str; | |
26 | + int src_line; | |
27 | + int src_col; | |
28 | + string src_str; | |
29 | + public bool isEof() | |
30 | + { | |
31 | + return src_str == ";";//"とりあえずセミコロンで終わる。 | |
32 | + } | |
33 | + public Token(string src_str ,int src_line, int src_col, TokenType t) | |
34 | + { | |
35 | + this.src_col = src_col; | |
36 | + this.src_line = src_line; | |
37 | + this.src_str = src_str; | |
38 | + this.tokenType = t; | |
39 | + } | |
40 | + public override string ToString() | |
41 | + { | |
42 | + return $"{tokenType}:line={src_line}:col={src_col}:{src_str}"; | |
43 | + } | |
44 | + } | |
45 | +} |
@@ -0,0 +1,81 @@ | ||
1 | +using System; | |
2 | +using System.Collections.Generic; | |
3 | +using System.Linq; | |
4 | +using System.Text; | |
5 | +using System.Threading.Tasks; | |
6 | +using static getToken.TokenType; | |
7 | + | |
8 | +namespace getToken | |
9 | +{ | |
10 | + class TokenGetter | |
11 | + { | |
12 | + private int src_line; | |
13 | + private int src_col; | |
14 | + | |
15 | + TokenType getCharType(char chr) | |
16 | + { | |
17 | + if (chr >= '0' && chr <= '9') | |
18 | + return Digit; | |
19 | + if ((chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z')) | |
20 | + return Letter; | |
21 | + | |
22 | + switch (chr) | |
23 | + { | |
24 | + case '{': return LBrace; | |
25 | + case '}': return RBrace; | |
26 | + case '+': return Plus; | |
27 | + case '-': return Minus; | |
28 | + case '*': return Mult; | |
29 | + case '/': return Div; | |
30 | + case '(': return Lparen; | |
31 | + case ')': return Rparen; | |
32 | + case '=': return Equal; | |
33 | + case '<': return Lss; | |
34 | + case '>': return Gtr; | |
35 | + case ',': return Comma; | |
36 | + case '.': return Period; | |
37 | +// case ';': return Semicolon; | |
38 | + case ':': return Colon; | |
39 | + default: | |
40 | + break; | |
41 | + } | |
42 | + return Others; | |
43 | + | |
44 | + | |
45 | + | |
46 | + } | |
47 | + int NextChar() | |
48 | + { | |
49 | + var c = Console.Read(); | |
50 | + if (c == '\n') | |
51 | + { | |
52 | + src_line++; | |
53 | + src_col = 0; | |
54 | + } | |
55 | + else | |
56 | + { | |
57 | + src_col++; | |
58 | + } | |
59 | + return c; | |
60 | + } | |
61 | + public Token NextToken() | |
62 | + { | |
63 | + int c = NextChar(); | |
64 | + while (true) | |
65 | + { | |
66 | + if (c == ' ' || c == '\t') | |
67 | + { | |
68 | + ; | |
69 | + } | |
70 | + else | |
71 | + { | |
72 | + break; | |
73 | + } | |
74 | + c = NextChar(); | |
75 | + | |
76 | + } | |
77 | + var t = getCharType((char)c); | |
78 | + return new Token(c.ToString(),src_line,src_col, t); | |
79 | + } | |
80 | + } | |
81 | +} |