|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.12.2010, 17:55 | #1 |
Пользователь
Регистрация: 12.04.2010
Сообщений: 10
|
Синтаксический анализатор оператора case
Добрый вечер. Возникла при решении задачи. Привожу условие и соответсвующий код.
Условие: Оператор варианта case языка Pascal. В кач-ве операторов, среди которых производиться выбор для исполнения, используйте только операторы присваивания, правой частью которых яв-ся арифметические выражения, составленные из простых переменных и констант целого типа, круглых скобок и знаков арифметических операций: сложения, вычитания, умножения и деления. Приоритет операций обычный. program ParseCase; uses crt; const EOT = #0; var ch:char; pos:integer; zikl:string; line:integer; procedure NextCh; begin if eoln then begin {ch:=#10;} readln; line:=line + 1; pos:=0; end else begin read(ch); pos:=pos + 1; zikl:=zikl + ch; end; end; procedure ResetText; begin {clrscr;} pos:=0; line:=0; writeln('Vvedite operator'); zikl:=''; NextCh; while ch = ' ' do NextCh; end; procedure Error(Message:string); begin {writeln('^'os); writeln('Sintaksicheskaia ochibka: ', Message); } writeln('Sintaksicheskaia ochibka:', Message ,' ', line, ' stroke ', pos,' posicii'); halt; end; procedure Number; begin while ch in ['0'..'9'] do NextCh; end; procedure Name; begin while ch in ['A'..'Z', 'a'..'z','_'] do NextCh; end; procedure ListConst; begin while ch = ' ' do NextCh; Name; Number; if ch = ':' then NextCh else Error('Ojidaetsa :'); end; procedure OperCase; begin if ch in ['C', 'c'] then NextCh else Error('Ojidaetsa C'); if ch in ['A', 'a'] then NextCh else Error('Ojidaetsa A'); if ch in ['S', 's'] then NextCh else Error('Ojidaetsa S'); if ch in ['E', 'e'] then NextCh else Error('Ojidaetsa E'); if ch = ' ' then NextCh else Error('Ojidaetsa probel'); while ch = ' ' do NextCh; Name; if ch = ' ' then NextCh else Error('Ojidaetsa probel'); while ch = ' ' do NextCh; if ch in ['O', 'o'] then NextCh else Error('Ojidaetsa O'); if ch in ['F', 'f'] then NextCh else Error('Ojidaetsa F'); ListConst; end; begin ResetText; OperCase; if ch<>EOT then Error('Ojidaetsa konec texta') else writeln('Pravilno !!!'); writeln; end. Код данной программы не докончен. Собственно проблема заключается в том, как записать конструкцию оператора case в привычную форму, а не в одну строчку. Что именно мне нужно подкорректировать в процедуре NextCh ? Например я могу записать так case n of 1: ...; 2: ...; n...; но я хотел бы вот так case n of 1: 2: 3: и т.д. Последний раз редактировалось goldlider; 23.12.2010 в 18:00. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синтаксический анализатор sin, cos, ln, exp | Ruslan-9020 | Общие вопросы C/C++ | 3 | 20.05.2013 01:10 |
Синтаксический анализатор | Lifefine | Общие вопросы Delphi | 3 | 09.10.2010 19:42 |
Синтаксический анализатор математических выражений | Blade | Общие вопросы C/C++ | 7 | 21.05.2010 14:59 |
Синтаксический анализатор | delphin100 | Общие вопросы Delphi | 10 | 01.05.2010 12:50 |