我正在做如何在bison + flex中使用縮進作爲塊分隔符。就像在Python中一樣。我正在編寫自己的編程語言(主要是爲了好玩,但我打算將它與遊戲引擎一起使用),我會嘗試提出一些特殊的東西,最大限度地減少樣板並最大限度地提高開發速度。如何使用縮進作爲塊分隔符使用野牛和flex
我已經寫了一個編譯器(實際上是一個`langToy'給Nasm翻譯器),但是失敗了。由於某種原因,它只能處理整個源文件中的一個字符串(當然,我已經醒了超過48小時 - 所以......你知道,大腦崩潰了)。
我不知道大括號和/或begin - > end是否更容易實現(我沒有這個問題),或者只是我的大腦鎖定了。
在此先感謝!
更新:好吧,我不知道如何使用Flex做的線索。將多個DEDENT返回給解析器時遇到問題。 Flex/Bison對我而言是比較新的。
更新2: 這是柔性的文件我已經想出了爲止;它不完全明白它:
%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();
}
你可以嘗試玩它,也許你看到我失蹤。返回多個dedent在haXe中會很容易(return t_dedent(num);)。
此代碼並不總是正確匹配縮進/縮進。
更新3:我認爲我會放棄對柔性希望,做我自己的方式,如果有人知道如何做到這一點的柔性我會很樂意聽到它反正。
看起來好像你已經得到了它,但我希望製表符被計爲2個空格。所以我猜這條線應該是 current_line_indent =(current_line_indent + 2)& ~1; – Frank 2009-10-03 17:39:00
是的 - 當你看到一個標籤時,你需要將current_line_indent撞到下一個tabstop。 – 2009-10-04 05:37:10