编译器构造 – 如何使用缩进作为块分隔符与bison和flex
发布时间:2020-12-15 02:17:04 所属栏目:百科 来源:网络整理
导读:我的伤员如何在野牛弯曲中实现压痕定义.就像在 python.我正在编写自己的编程语言(主要是为了好玩,但是我打算和游戏引擎一起使用),我会尝试一些特殊的东西,最大限度地减少样板并最大限度地提高开发速度. 我已经在C中编写了一个编译器(实际上是一个“langToy”
我的伤员如何在野牛弯曲中实现压痕定义.就像在
python.我正在编写自己的编程语言(主要是为了好玩,但是我打算和游戏引擎一起使用),我会尝试一些特殊的东西,最大限度地减少样板并最大限度地提高开发速度.
我已经在C中编写了一个编译器(实际上是一个“langToy”到Nasm翻译器),但是失败了.由于某种原因,它只能处理整个源文件中的一个字符串(好吧,我已经醒了超过48小时 – 所以…你知道,大脑崩溃). 我不知道如果大括号和/或开始 – >结束更容易实现(我没有这样做的问题),或者只是我的大脑锁定. 提前致谢! 更新:好的,我不知道如何用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(); } 你可以尝试玩弄它,也许你看到我失踪了.返回多个奉献者将是一个容易的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 ... 您必须确保在缩进模式下启动解析(以获得第一行的缩进). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |