我想尝试使用Shakespeare programming language,因此我从here下载并使用cd spl-1.2.1
Make
执行了Makefile。
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 I / SCENE I之外的所有ACT / SCENE行来解决问题。
答案 0 :(得分:23)
这是词法分析器中正则表达式的缺陷。
I notified the original authors.
Here's a release of the language that includes the fix for your enjoyment.
There are still a few warnings,但它们似乎没有任何影响。 Let me know如果您发现任何其他功能问题,我会看到我可以用它们做些什么。
(Roffel - 如果不是因为没有人关心这个问题,这将是一种死灵法。)
答案 1 :(得分:3)
此问题是由版本2.5.4和2.5.33之间的Flex引入的错误引起的;也就是说,在莎士比亚处理器编写和问这个问题之间。该错误涉及在不区分大小写的正则表达式中使用带有单字符参数的带括号的重复运算符(例如i{1,3}
,这是罗马数字的莎士比亚flex规范的一部分);错误的结果是不区分大小写不敏感,因此i{1,3}
被扩展为好像[iI]i?i?
而不是[iI][iI]?[iI]?
。这意味着具有重复字符的大写罗马数字(在莎士比亚源代码中是正常的)将无法正确识别。
Kyle Cartmell在Marlowe中的变化在正则表达式中使用大写字母而不是小写字母,这颠倒了问题,因此只有大写罗马数字可靠地工作。
我将Flex错误报告为https://github.com/westes/flex/issues/193。如果有人在官方发布之前需要它,它就是Flex的单行补丁。
答案 2 :(得分:1)
scanner.l:600: warning, rule cannot be matched
的第一个问题是因为单词rotten
已添加两次到文件include/negative_adjective.wordlist
,只需将其从那里删除,第一个警告将被删除。但这并不能解决其余问题。如果我能解决更多问题,请看看这里。