我了解如何在 bison + flex 中实现缩进作为块分隔符。就像在 python 中一样。我正在编写自己的编程语言(主要是为了好玩,但我打算将它与游戏引擎一起使用),我将尝试提出一些特别的东西,以最大限度地减少样板并最大限度地提高开发速度。
我已经用 C 编写了一个编译器(实际上是 Nasm 翻译器的“langToy”),但失败了。由于某种原因,它只能处理整个源文件中的一个字符串(好吧,我已经醒了超过 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 ); ) 中返回多个 dedent 会很容易。
此代码并不总是正确匹配缩进/缩进。
更新 3:我认为我会放弃对 flex 的希望并以自己的方式去做,如果有人知道如何在 flex 中做到这一点,无论如何我都会很高兴听到它。