编译器构造 – 如何使用缩进作为块分隔符与bison和flex

前端之家收集整理的这篇文章主要介绍了编译器构造 – 如何使用缩进作为块分隔符与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(返回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 ...

您必须确保在缩进模式下启动解析(以获得第一行的缩进).

猜你在找的Flex相关文章