![]() |
|
|
![]()
|
|
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Добрый день.
НУжно постоить дерево конструкций if-then-else-case языка Pascal. Мой алгоритм такой: из текста выдираю if-then-else-case регулярным выражением, а дальше начинаются проблемы Например if then if then else не получается отнести последний else к первому if может кто сталкивался с данной проблемой и может помочь? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
потому что не хватает begin-end'ов. без них в этом примере else и в самом деле будет относится к внутреннему блоку Добавлено через 2 минуты и 12 секунд А рекурсивному спуску вас там, случайно не учили? Достаточно универсальный и простой в реализации метод парсинга. Для паскаля, во всяком случае, подходит. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
нет, с рекурсивным списком не знаком
программу пишу на C# может там есть какие-то возможности для задания моего? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Рекурсивный спУск. Recursive descent parser, если по буржуински. Проще погуглить и поискать примеры реализации какой-то несложной грамматики на каком-нибудь знакомом языке программирования, тогда его простота будет очевиднее. Обычно встречается заумное математическое описание, которое у недостаточно преосвященного человека может вызвать только отвращение Можно стековой машинкой парсить. Это, возможно, проще в смысле понимания механизма действия... А какие еще конструкции в языке предполагаются? Весь паскаль или только урезанный набор конструкций? Если урезанный, возможно и регулярками можно обойтись... -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
парсить нужно только конструкции if-then-else-case
|
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Teresh, в Паскале есть конструкция
что такое слово case?
Это ? Без скобок begin-end различать вложенные if'ы нельзя. Они есть? -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
да, case этот
в условии begin-end опционально, но раз без них не работает, то сделаю как обязательное условие |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Работает, если блок состоит из одного оператора. Если больше - наличие begin-end является обязательным. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ksnk |
|
||||||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Если про рекурсивный спуск, то
-- нужна разбивка входящего потока по токенам. Токенами будут служебные слова (if|then|else|case|of|begin|end), символы : и ; и финальная . для пущего эффекта. Все остальное будем называть литералами. Разумно выковыривать токены из входящего потока регулярками, хотя иногда эффективнее (с++ и ниже) писать конечный автомат. -- функция getNext() будет выдавать нам следующий токен из потока -- функция goBack() сделает так, чтобы getNext выдал опять тот-же токен, что и в прошлый раз -- текст программы - последовательность операторов, разделенная ; оканчивающаяся точкой.
Оператор - это либо if, либо case, либо begin-end, либо литералы. Определяется по начальному токену.
Конструкция Begin-end - последовательность операторов. заканчивающаяся словоv end
Конструкция if-then-else
Ну и так далее. Все получается довольно компактно, рекурсивно и обозримо, стоит только приноровится -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||||||
|
|||||||||
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Спасибо, вроде разобрался. На самом деле всё довольно просто и понятно.
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |