Автор Тема: Раскручиваем компилятор O7  (Прочитано 40705 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #60 : Ноябрь 07, 2013, 06:26:49 pm »
после последнего слова тоже стоит пробел

Кстати да, если добавить с начала и в конце пробелы - то условия упрощаются (не нужны проверки на пограничные условия - начало и конец строки).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #61 : Ноябрь 07, 2013, 06:29:20 pm »
PS.
Как же тяжко писать много букафф, вместо просто  $d(words(s)) как в МУМПСе  :)

Хе-хе. На питоне:
s in ' '.split(words)

Типа:
- Почему в популярны языках нет Цикла Дейкстры?
- Потому что он там нинужен

:)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #62 : Ноябрь 07, 2013, 07:48:44 pm »
Да не ниненужен, а не осилили :)

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #63 : Ноябрь 07, 2013, 07:50:00 pm »
Решение мне не понятно. Мало узнать, является слово ключевым или нет, нужно знать какое это ключевое слово. Повторно сравнивать строки в дальнейшем будет излишеством. А если так, то таблица вместе с линейным поиском по ней, немногим лучше таблицы, встроенной в развернутый линейный поиск, которые легко реализуется на Обероне.
А вообще-то тут должна быть расстановочная таблица (хэш-массив)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #64 : Ноябрь 07, 2013, 07:51:51 pm »
PS.
Как же тяжко писать много букафф, вместо просто  $d(words(s)) как в МУМПСе  :)

Хе-хе. На питоне:
s in ' '.split(words)

И в хацкеле:
s `elem` (words keywords)(words -- это в хаскелле стандартная функция, поэтому строку, содержащую ключевые слова, назовём как keywords)

Типа:
- Почему в популярны языках нет Цикла Дейкстры?
- Потому что он там нинужен

:)
Либо легко эмулируется при необходимости (как в сях тремя макросами).
#define WHILE     for(;;) if (
#define DO        ) {
#define ELSIF     ; } else if (
#define WEND      ; } else break

int gcd(int x, int y)
{
    WHILE x > y DO x = x - y
    ELSIF x < y DO y = y - x
    WEND;
    return x;
}
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #65 : Ноябрь 07, 2013, 08:34:13 pm »
Решение мне не понятно. Мало узнать, является слово ключевым или нет, нужно знать какое это ключевое слово.

Тут лексер не совсем классический. Он не просто разбирает входной поток на лексемы, а ожидает вполне конкретную лексему. В данном случае он ожидает идентификатор и ничто другое. Поэтому для того, чтобы определить удалось ли ему получить идентификатор или нет - ему не обязательно знать какое именно ключевое слово ему попалось вместо идентификатора. Повторного сравнения все равно не будет.

Повторно сравнивать строки в дальнейшем будет излишеством. А если так, то таблица вместе с линейным поиском по ней, немногим лучше таблицы, встроенной в развернутый линейный поиск, которые легко реализуется на Обероне.
А вообще-то тут должна быть расстановочная таблица (хэш-массив)

В данном случае нужно то, что нужно - определить принадлежность к списку зарезервированных слов (там на самом деле два этих списка, другой список - список жабаскриптовых зарезервированных слов). Как можно проще. Альтернативные решения приветствуются, но в рамках поставленной задачи.

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #66 : Ноябрь 07, 2013, 08:52:50 pm »
PROCEDURE IsReservedOberonWord(s: ARRAY OF CHAR): BOOLEAN;
BEGIN
    RETURN s = "ARRAY" OR s = "IMPORT" OR s = "THEN" OR s = "BEGIN" OR s = "IN" OR s = "TO" OR s = "BY" OR
                s = "IS" OR s = "TRUE" OR s = "CASE" OR s = "MOD" OR s = "TYPE" OR s = "CONST" OR s = "MODULE" OR
                s = "UNTIL" OR s = "DIV" OR s = "NIL" OR s = "VAR" OR s = "DO" OR s = "OF" OR s = "WHILE" OR s = "ELSE" OR
                s = "OR" OR s = "ELSIF" OR s = "POINTER" OR s = "END" OR s = "PROCEDURE" OR s = "FALSE" OR
                s = "RECORD" OR s = "FOR" OR s = "REPEAT" OR s = "IF" OR s = "RETURN"
END IsReservedOberonWord;
Проще некуда. "Таблица" зарезервированных слов немного разбавлена кодом, но в в целом простота составления приблизительно на том же уровне. Не тестировал.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #67 : Ноябрь 07, 2013, 09:09:46 pm »
Проще некуда.

Да, засчитано. Но не могу применить в текущей реализации - оно странслируется в ужос-ужос.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #68 : Ноябрь 07, 2013, 09:15:26 pm »
    RETURN s = "ARRAY" OR s = "IMPORT" OR s = "THEN" OR s = "BEGIN" OR s = "IN" OR s = "TO" OR s = "BY"

Гы! И здесь тоже скобочки нужны! :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #69 : Ноябрь 07, 2013, 09:20:04 pm »
Проще некуда.

Да, засчитано. Но не могу применить в текущей реализации - оно странслируется в ужос-ужос.
Дак, этта.. Пофиксить надыть. Хотя вначале с этими relations надо разобраться.
Y = λf.(λx.f (x x)) (λx.f (x x))

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #70 : Ноябрь 07, 2013, 09:54:25 pm »
    RETURN s = "ARRAY" OR s = "IMPORT" OR s = "THEN" OR s = "BEGIN" OR s = "IN" OR s = "TO" OR s = "BY"

Гы! И здесь тоже скобочки нужны! :)
Проглядел, хотя так:
    RETURN (s = "ARRAY") OR (s = "IMPORT") OR (s = "THEN") OR (s = "BEGIN") OR (s = "IN") OR (s = "TO") OR (s = "BY")
по-моему, читаемость только выше

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #71 : Ноябрь 08, 2013, 05:12:32 am »
Да уж, уныло, конечно:

PROCEDURE IsReservedOberonWord(s: ARRAY OF CHAR): BOOLEAN;
BEGIN
    RETURN (s = "ARRAY")   OR (s = "IMPORT") OR (s = "THEN")
        OR (s = "BEGIN")   OR (s = "IN")     OR (s = "TO")
        OR (s = "BY")      OR (s = "IS")     OR (s = "TRUE")
        OR (s = "CASE")    OR (s = "MOD")    OR (s = "TYPE")
        OR (s = "CONST")   OR (s = "MODULE") OR (s = "UNTIL")
        OR (s = "DIV")     OR (s = "NIL")    OR (s = "VAR")
        OR (s = "DO")      OR (s = "OF")     OR (s = "WHILE")
        OR (s = "ELSE")    OR (s = "OR")     OR (s = "ELSIF")
        OR (s = "POINTER") OR (s = "END")    OR (s = "PROCEDURE")
        OR (s = "FALSE")   OR (s = "RECORD") OR (s = "FOR")
        OR (s = "REPEAT")  OR (s = "IF")     OR (s = "RETURN")
END IsReservedOberonWord;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #72 : Ноябрь 08, 2013, 06:09:51 am »
А вот вариант, основанный на идее, подсмотренной в исходниках BB:
PROCEDURE IsReservedOberonWord(s: ARRAY OF CHAR): BOOLEAN;
VAR res: BOOLEAN
BEGIN
  CASE s[0] OF
  | 'A': res := s = "ARRAY";
  | 'B': res := (s = "BEGIN") OR (s = "BY");
  | 'C': res := (s = "CASE") OR (s = "CONST");
  | 'D': res := (s = "DIV") OR (s = "DO");
  | 'E': res := (s = "END") OR (s = "ELSE") OR (s = "ELSIF");
  | 'F': res := (s = "FALSE") OR (s = "FOR");
  | 'I': res := (s = "IMPORT") OR (s = "IN") OR (s = "IS") OR (s = "IF");
  | 'M': res := (s = "MOD") OR (s = "MODULE");
  | 'N': res := s = "NIL";
  | 'O': res := (s = "OF") OR (s = "OR");
  | 'P': res := (s = "POINTER") OR (s = "PROCEDURE");
  | 'R': res := (s = "RECORD") OR (s = "REPEAT") OR (s = "RETURN");
  | 'T': res := (s = "TO") OR (s = "THEN") OR (s = "TRUE") OR (s = "TYPE");
  | 'U': res := s = "UNTIL";
  | 'V': res := s = "VAR";
  | 'W': res := s = "WHILE";
  ELSE res := FALSE
  END;
  RETURN res
END IsReservedOberonWord;

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #73 : Ноябрь 08, 2013, 07:02:26 am »
А вот вариант, основанный на идее, подсмотренной в исходниках BB:
PROCEDURE IsReservedOberonWord(s: ARRAY OF CHAR): BOOLEAN;
VAR res: BOOLEAN
BEGIN
  CASE s[0] OF
  | 'A': res := s = "ARRAY";
  | 'B': res := (s = "BEGIN") OR (s = "BY");
  | 'C': res := (s = "CASE") OR (s = "CONST");
  | 'D': res := (s = "DIV") OR (s = "DO");
  | 'E': res := (s = "END") OR (s = "ELSE") OR (s = "ELSIF");
  | 'F': res := (s = "FALSE") OR (s = "FOR");
  | 'I': res := (s = "IMPORT") OR (s = "IN") OR (s = "IS") OR (s = "IF");
  | 'M': res := (s = "MOD") OR (s = "MODULE");
  | 'N': res := s = "NIL";
  | 'O': res := (s = "OF") OR (s = "OR");
  | 'P': res := (s = "POINTER") OR (s = "PROCEDURE");
  | 'R': res := (s = "RECORD") OR (s = "REPEAT") OR (s = "RETURN");
  | 'T': res := (s = "TO") OR (s = "THEN") OR (s = "TRUE") OR (s = "TYPE");
  | 'U': res := s = "UNTIL";
  | 'V': res := s = "VAR";
  | 'W': res := s = "WHILE";
  ELSE res := FALSE
  END;
  RETURN res
END IsReservedOberonWord;

Тогда уж можно и полное дерево построить :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #74 : Ноябрь 08, 2013, 07:23:57 am »
Тогда уж можно и полное дерево построить :-)
Это будет уже перебор.
В предложенном мной варианте компилятор сгенерирует по кэйсу очень быструю таблицу переходов, и далее потребуется не более четырёх сравнений строк.
Если, например, повторить этот трюк внутри обработки случаев 'I' и 'T', то профит будет уже не столь впечатляющим, если вообще будет.
« Последнее редактирование: Ноябрь 08, 2013, 07:27:42 am от igor »