Компиляция и выполнение переводчика языка программирования Шекспира spl2c в Mac OS X 10.6 приводит к предупреждениям / ошибкам - PullRequest
8 голосов
/ 22 декабря 2009

Я хотел поэкспериментировать с языком программирования Шекспира , поэтому я скачал его с здесь и выполнил Makefile, используя cd spl-1.2.1 Make.

Компиляция spl2c выполняется с парой предупреждений:

scanner.l:600: warning, rule cannot be matched
<stdout>:5808: warning: ‘yyunput’ defined but not used

И затем, когда он пытается скомпилировать все примеры, все идет наперекосяк:

../spl/bin/spl2c < fibonacci.spl > fibonacci.c
Warning at line 19: equality expected
Warning at line 28: equality expected
Warning at line 30: comment expected
Warning at line 30: comment expected
Warning at line 30: comment expected
Warning at line 30: comment expected
Warning at line 32: comment expected
Warning at line 32: comment expected
Warning at line 32: comment expected
Warning at line 32: comment expected
Warning at line 34: comment expected
Warning at line 34: comment expected
Warning at line 34: comment expected
Warning at line 34: comment expected
Warning at line 36: comment expected
Warning at line 36: comment expected
Warning at line 37: comment expected
Warning at line 37: comment expected
Warning at line 37: comment expected
Warning at line 37: colon expected
Warning at line 40: equality expected
Warning at line 51: comment expected
Warning at line 51: comment expected
Warning at line 51: comment expected
Warning at line 51: comment expected
Warning at line 51: comment expected
Warning at line 51: colon expected
Error at line 59: 'act [roman number]' or 'scene [roman number]' expected
1 errors and 27 warnings found. No code output.

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

Я бегу OS X 10.6.2, gcc version 4.2.1 (Apple Inc. build 5646) (dot 1), flex 2.5.35 и bison (GNU Bison) 2.3.

РЕДАКТИРОВАТЬ: Для простых программ, не требующих gotos (например, hello.spl), вы можете обойти проблему, удалив все строки ACT / SCENE, кроме первой ACT I / SCENE I.

Ответы [ 3 ]

23 голосов
/ 11 декабря 2010

Это дефект регулярного выражения в лексическом парсере.

Я раздвоил язык.

Я исправил проблему.

Я уведомил оригинальных авторов.

Вот версия языка, которая включает исправление для вашего удовольствия.

Есть еще несколько предупреждений , но они, похоже, ни на что не влияют. Дайте мне знать , если вы обнаружите какие-либо другие функциональные проблемы, и я посмотрю, что я могу с ними сделать.

(Роффель - это было бы некромантией, если бы не тот факт, что никто не заботится об этой проблеме.)

3 голосов
/ 08 апреля 2017

Эта проблема возникает из-за ошибки в Flex, появившейся где-то между версиями 2.5.4 и 2.5.33; то есть между временем, когда был написан процессор Шекспира, и задан этот вопрос. Ошибка заключается в использовании оператора фигурного повторения с односимвольными аргументами в регулярном выражении без учета регистра (например, i{1,3}, которое является частью спецификации Шекспира для римских чисел); Следствием ошибки является то, что нечувствительность к регистру теряется, поэтому i{1,3} расширяется, как если бы это было [iI]i?i? вместо [iI][iI]?[iI]?. Это означает, что римские цифры в верхнем регистре с повторяющимися символами (что является нормой в исходном коде Шекспира) не будут правильно определены.

Изменение Кайла Картмелла в Marlowe использует заглавные буквы в регулярном выражении вместо строчных, что переворачивает проблему, так что только римские цифры верхнего регистра работают надежно.

Я сообщил об ошибке Flex как https://github.com/westes/flex/issues/193. Это исправление в одну строку для Flex, если оно кому-то нужно до официального выпуска.

1 голос
/ 23 декабря 2009

Первая проблема с scanner.l:600: warning, rule cannot be matched заключается в том, что слово rotten было добавлено два раза в файл include/negative_adjective.wordlist, просто удалите его и первое предупреждение будет удалено. Это не исправить все остальное, хотя. Посмотрите здесь, могу ли я починить что-нибудь еще.

...