我很想知道如何在 bison + flex 中实现缩进作为块分隔符。就像在 python 中一样。我正在编写自己的编程语言(主要是为了好玩,但我打算将其与游戏引擎一起使用),我将尝试想出一些特殊的东西来最小化样板文件并最大化开发速度。
我已经写了一个编译器(实际上是‘郎玩具’到 Nasm 翻译器)在 C 中,但失败了。由于某种原因,它只能处理整个源文件中的一个字符串(好吧,我已经醒了超过 48 小时 - 所以......你知道,大脑崩溃了)。
我不知道大括号和/或开始 -> 结束是否更容易实现(我这样做没有问题)或者是否只是我的大脑锁定了。
提前致谢!
Update:好吧,我不知道如何用 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 中返回多个 dedent 会很容易( return t_dedent( num ); )。
此代码并不总是正确匹配缩进/缩进。
更新3:我想我会放弃对 Flex 的希望并按照自己的方式去做,如果有人知道如何在 Flex 中做到这一点,无论如何我都会很高兴听到它。