我的伤员如何在野牛弯曲中实现压痕定义.就像在
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(返回t_dedent(num);).
此代码并不总是与缩进/正确匹配.
更新3:我认为我会放弃对flex的希望,并以自己的方式做,如果有人知道如何做flex,我会很乐意听到它.
解决方法
您需要做的是弹性计算每行开始处的空格,并插入适当数量的INDENT / UNINDENT令牌,以供解析器用于分组.一个问题是你想对标签vs空格做些什么 – 你只是想让它们与固定的标签页相同,或者你想要缩进是一致的(所以如果一行以一个标签和下一个开头有一个空格,你发出一个错误,这可能有点困难).
假设你想要固定的8列tabstops,你可以使用类似的东西
%{ /* globals to track current indentation */ int current_line_indent = 0; /* indentation of the current line */ int indent_level = 0; /* indentation level passed to the parser */ %} %x indent /* start state for parsing the indentation */ %s normal /* normal start state for everything else */ %% <indent>" " { current_line_indent++; } <indent>"\t" { current_line_indent = (current_line_indent + 8) & ~7; } <indent>"\n" { current_line_indent = 0; /*ignoring blank line */ } <indent>. { unput(*yytext); if (current_line_indent > indent_level) { indent_level++; return INDENT; } else if (current_line_indent < indent_level) { indent_level--; return UNINDENT; } else { BEGIN normal; } } <normal>"\n" { current_line_indent = 0; BEGIN indent; } ... other flex rules ...
您必须确保在缩进模式下启动解析(以获得第一行的缩进).