programming language
Revisión | a2b669c27c059f4bf21f1aadb8b4d7105607cdd2 (tree) |
---|---|
Tiempo | 2023-02-03 23:28:24 |
Autor | dhrname <dhrname@joes...> |
Commiter | dhrname |
New LexicalAnalysis class
@@ -44,9 +44,83 @@ namespace jstr | ||
44 | 44 | { |
45 | 45 | using namespace std; |
46 | 46 | |
47 | + class LexicalAnalysis | |
48 | + { | |
49 | + public: | |
50 | + LexicalAnalysis() | |
51 | + { | |
52 | + } | |
53 | + | |
54 | + virtual ~LexicalAnalysis() | |
55 | + { | |
56 | + } | |
57 | + | |
58 | + virtual FlexLexer* getLexer(const char* st); | |
59 | + }; | |
60 | + | |
61 | + enum class ErrorCode | |
62 | + { | |
63 | + ERR_EQUALITY | |
64 | + , ERR_NO_NUMBER_AFTER_EQUAL | |
65 | + , ERR_NO_ID_NAME_AFTER_EQUAL | |
66 | + , ERR_NO_ID_NAME_AFTER_FUNCTOR | |
67 | + , ERR_NOT_FOUND_SEMICOLON_COLON | |
68 | + , ERR_INVALID_SYMBOL_AFTER_CLASS | |
69 | + , ERR_NO_STATEMENT | |
70 | + , ERR_INVALID_SYMBOL_AFTER_BLOCKSTATEMENT | |
71 | + , ERR_DOT | |
72 | + , ERR_NOT_FOUND_SEMICOLON_STATEMENT | |
73 | + , ERR_NOT_DECLARATION_ID_NAME | |
74 | + , ERR_ASSIGNMENT_TO_CONSTANT_CLASS_NAME | |
75 | + , ERR_NOT_FOUND_ASSIGN_SYMBOL | |
76 | + }; | |
77 | + | |
78 | + /*Tester クラス | |
79 | + * 文法エラーを処理するクラス | |
80 | + * エラーが起きたとき、Don't panic rule (あわてない規則)を適用する*/ | |
81 | + class Tester: public LexicalAnalysis | |
82 | + { | |
83 | + public: | |
84 | + std::vector<std::string> errorMessage; | |
85 | + Tester() | |
86 | + : errorMessage{ | |
87 | + "=の代わりに==を用いよ" | |
88 | + , "=の後に数が来るべき" | |
89 | + , "=の後に識別子の名前が来るべき" | |
90 | + , "*.の後に識別子の名前が来るべき" | |
91 | + , "セミコロン (;) かコンマ (,) が無い" | |
92 | + , "クラス宣言の後に不正な記号がある" | |
93 | + , "複合文があるはず" | |
94 | + , "ブロック中の複合文の次に不正な記号がある" | |
95 | + , "ピリオド (.)があるはず" | |
96 | + , "複合文の間のセミコロン (;) が抜けている" | |
97 | + , "識別子の名前がまだ宣言されていない" | |
98 | + , "定数、またはクラス名への代入は許されない" | |
99 | + , "代入演算子 (=) があるはず" | |
100 | + , "callの後に識別子の名前が必要" | |
101 | + , "定数、あるいは変数の呼び出しは意味が無い" | |
102 | + , "コロン (:) があるはず" | |
103 | + , "セミコロン (;) があるはず" | |
104 | + , "doがあるはず" | |
105 | + , "複合文の後に不正な記号がある" | |
106 | + , "関係演算子があるはず" | |
107 | + , "式に関手が含まれてはいけない" | |
108 | + , "右かっこが抜けている" | |
109 | + , "直前の因子の次にこの記号が続くのは不可能" | |
110 | + , "式はこの記号で始まってはならない" | |
111 | + , "この数は大きすぎる" | |
112 | + } | |
113 | + { | |
114 | + } | |
115 | + | |
116 | + virtual ~Tester() | |
117 | + { | |
118 | + } | |
119 | + }; | |
120 | + | |
47 | 121 | /*AbstractSyntaxTree クラス |
48 | 122 | * 抽象構文木を表現するクラス*/ |
49 | - class AbstractSyntaxTree | |
123 | + class AbstractSyntaxTree: public Tester | |
50 | 124 | { |
51 | 125 | public: |
52 | 126 | /*抽象構文木の現在ノード |
@@ -296,12 +370,10 @@ namespace jstr | ||
296 | 370 | /*declaration_list: |
297 | 371 | INDENT |
298 | 372 | declaration |
299 | - LINEEND | |
300 | 373 | declaration_list |
301 | 374 | | <ε>*/ |
302 | 375 | {INDENT |
303 | 376 | , declaration |
304 | - , LINEEND | |
305 | 377 | , declaration_list} |
306 | 378 | ,{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0} |
307 | 379 | ,{} |
@@ -391,6 +463,7 @@ namespace jstr | ||
391 | 463 | IDENTIFIER |
392 | 464 | name_list |
393 | 465 | bee_constant |
466 | + LINEEND | |
394 | 467 | | DETACH |
395 | 468 | LINEEND |
396 | 469 | | CALL |
@@ -404,7 +477,8 @@ namespace jstr | ||
404 | 477 | {type_specifier |
405 | 478 | , IDENTIFIER |
406 | 479 | , name_list |
407 | - , bee_constant} | |
480 | + , bee_constant | |
481 | + , LINEEND} | |
408 | 482 | ,{DETACH, LINEEND} |
409 | 483 | ,{CALL, IDENTIFIER, LINEEND} |
410 | 484 | ,{RESUME, IDENTIFIER, LINEEND} |