Выделение классов лексем
Для грамматики языка ASMLENG можно определить следующие классы лексем:
- идентификатор – id;
- ключевые слова – AL АН BL ВН CL СН DL DH АХ ЕАХ ВХ ЕВХ СХ ЕСХ DX EDX ВР ЕВР SP ESP DI EDI SI ESI BYTE SBYTE WORD SWORD DWORD SDWORD FWORD QWORD TBYTE REAL4 REAL8 REAL10 NEAR16 NEAR32 FAR16 FAR32 AND NOT HIGH LOW HIGHWORD LOWWORD OFFSET SEG LROFFSET TYPE THIS PTR WIDTH MASK SIZE SIZEOF LENGTH LENGTHOF ST SHORT.TYPE OPATTR MOD NEAR FAR OR XOR EQ NE LT LE GT GE CS DS ES FS GS SS SHR SHL CRO CR2 CR3 DRO DR1 DR2 DR3 DR6 DR7 TR3 TR4 TR5 TR6 TR7 на-звание_команды;
- целые числа (константы) – 0123456789abcdefABCDEF;
- однолитерные разделители – +-/:. ()[],*" ' {}<>hoqtyHOQ Т Y;
- двулитерный разделитель – ; ;
- символьные строки – А5СП_символ_буква, любой_символ_кроме_кавычки.
Классы литер
В случае грамматики языка ASMLENG можно определить следующие классы литер:
- б – цифра;
- 1 – буква;
- b – литеры, которые игнорируются (к ним отнесем пробел); ¦.
- si – одиночные разделители: + – /:.()[],*"'{}<>;;
- s2 – двулитерный разделитель:;;.
Определение условий выхода из сканера для каждого класса лексем
Для каждого класса лексем определим условия, при которых сканер переходит в конечное состояние:
- для идентификаторов – появление во входном потоке сканера любого символа, отличного от d (цифра) или 1 (буква);
- ключевые слова – появление пробела и нахождение соответствия введенной лексемы одному из ключевых слов языка;
- целые числа (константы) – появление любого символа, отличного от d;
- однолитерные разделители – появление любого символа;
- двулитерные разделители – появление любого символа;,;;.
- символьные строки – появление завершающей кавычки…….г.
Построение автоматных грамматик для выделенных классов лексем
Для каждого класса лексем строится отдельная автоматная грамматика, соответствующая грамматике типа 3 по Хомскому. В нашем случае набор таких грамматик может выглядеть так, как показано ниже:
- идентификаторы – id, к которым по принципу построения можно отнести и ключевые слова – название_команды:
id › ASCII_CMMBon_6yKea | id ASCII_символ_буква | id decdigit:,; decdigit ^ 0|l|2|…8|9
- целые числа – chint:
digits › decdigit | digits decdigit | digits hexdigit decdigit › 0|l|2|3|4|5|6|7|8|9 ¦
- Oднолитерные разделители – +-/:.()[]. *"¦'---
SEPiL^.. |. |: |: | + | – | * I 4) / I L I ] Г Г I
- двулитерный разделитель – ; ;:
SEP2L ›: Q