![]() |
1
4
“传统”shell处理变量替换等问题的方式很难用lex/yacc处理。他们所做的更像是宏扩展,在扩展变量之后,他们重新标记输入,而不扩展更多的变量。例如,输入“xx$$foo”,其中“foo”定义为“bar”,“bar”定义为“$y”,将扩展为“xx$y”,将被视为单个单词(而$y将不会扩展)。 您可以在flex中处理这个问题,但是您需要大量的支持代码。您需要使用flex的yy_buffer_state工具,有时将输出重定向到一个缓冲区,然后重新扫描,并小心地使用start state s来控制变量何时可以扩展或不能扩展。 它可能更容易使用一个非常简单的lexer,它返回诸如alpha(一个或多个字母字符)、numeric(一个或多个数字)或whitespace(一个或多个空格或制表符)等标记,并让解析器对它们进行适当的组合,最后得到如下规则:
正如你所看到的,这会很快变得复杂。 |
![]() |
2
1
看起来一般不错
我不确定是什么
如果您在询问lex和parse之间的分工,我相信将宏处理和参数替换推到scanner中并让您的语法处理是完全合理的。
我真的认为
毕竟,如果它被重新定义为shell过程呢? |
![]() |
Kris · Flex-新行无法识别 7 年前 |
![]() |
omn_1 · yylineno为错误报告提供意外结果 7 年前 |
![]() |
lluisrojass · 为什么Yacc/野牛规则没有用? 7 年前 |
![]() |
gornvix · 分析多个文件时出现错误的lex状态 10 年前 |
![]() |
Jason Kleban · 语法规范解决移位/减少冲突 12 年前 |
![]() |
footy · 如何解决2+2和2++2冲突 12 年前 |
![]() |
KAction · Bison意外的标识符错误 12 年前 |