【发布时间】:2010-11-27 15:29:08
【问题描述】:
我知道如何在 bison + flex 中实现缩进作为块分隔符。就像在 python 中一样。我正在编写自己的编程语言(主要是为了好玩,但我打算将它与游戏引擎一起使用),我会尝试想出一些特别的东西来最大限度地减少样板并最大限度地提高开发速度。
我已经用 C 编写了一个编译器(实际上是一个 `langToy' 到 Nasm 的翻译器),但是失败了。由于某种原因,它只能处理整个源文件中的一个字符串(好吧,我已经醒了超过 48 小时 - 所以......你知道,大脑崩溃了)。
我不知道大括号和/或开始 -> 结束是否更容易实现(我这样做没有问题)或者只是我的大脑被锁定了。
提前致谢!
更新: 好的,我不知道如何使用 flex 来实现。我在将多个 DEDENT 返回到解析器时遇到问题。 Flex/Bison 对我来说相对较新。
更新 2: 这是我到目前为止提出的 flex 文件;它不太明白:
%x t
%option noyywrap
%{
int lineno = 0, ntab = 0, ltab = 0, dedent = 0;
%}
%%
<*>\n { ntab = 0; BEGIN(t); }
<t>\t { ++ntab; }
<t>. { int i; /* my compiler complains not c99 if i use for( int i=0... */
if( ntab > ltab )
printf("> indent >\n");
else if( ntab < ltab )
for( i = 0; i < ltab - ntab; i++ )
printf("< dedent <\n");
else
printf("= =\n");
ltab = ntab; ntab = 0;
BEGIN(INITIAL);
/* move to next rule */
REJECT;}
. /* ignore everything else for now */
%%
main()
{
yyin = fopen( "test", "r" );
yylex();
}
您可以尝试使用它,也许您会看到我缺少的东西。在 Haxe (return t_dedent(num);) 中返回多个 dents 会很容易。
此代码并不总是正确匹配缩进/缩进。
更新 3:我认为我会放弃对 flex 的希望并按照自己的方式做,如果有人知道如何在 flex 中做到这一点,我很乐意听到。 p>
【问题讨论】:
标签: compiler-construction bison flex-lexer