lex&yacc

LEX:

yytext 数组包含匹配模式的文本;

使词法分析程序工作的两条规则是:
1. lex 模式只匹配输入字符或字符串一次。
2. lex 执行当前输入的最长可能匹配的动作。

由 lex 产生的词法分析程序是一个称为 yylex()的 C 例程,我们可以调用它.

main()和 yyerror(),这组函数是使用 lex 生成的词法分析程序进行编译时所必需的.

lex 词法分析程序从标准I/O 文件 yyin 中读取输入,所以当需要时,只需要改变 yyin。yyin 的默认值是stdin,

因为默认输入源是标准输入。当 yylex()到达输入文件的尾端时,它调用 yywrap(),该函数返回数值 0 或 1。如
果值为 1,那么程序完成而且没有输入。换句话说,如果值为 0,那么词法分析程序假设 yywrap()已经打开了它要读取

的另一个文件,而且继续读取 yyin。默认的 yywrap()总是返回 1。

% lex ch1-02.l
% cc lex.yy.c –o first –ll

词法分析程序与语法分析程序的通信

当一起使用 lex 扫描程序和 yacc 语法分析程序时,语法分析程序(parser)(yyparse)是较
高级别的例程。当它需要来自输入的标记时,就调用词法分析程序 yylex()。然
后,词法分析程序从头到尾扫描输入识别标记。它一找到对语法分析程序有意义
的标记就返回到语法分析程序,将返回标记的代码作为 yylex()的值。

最重要的子程序是 main(),这个子程序重复调用 yyparse()直到词法分析程
序的输入文件结束。例程 yyparse()是由 yacc 生成的语法分析程序.
lex ch1-n.l
yacc –d ch1-m.y
cc –c lex.yy.c y.tab.c
cc –o example-m.n lex.yy.o y.tab.o -ll

=================================================================

1. lex使具有起始状态的规则跟在一个没有起始状态的规则之后

  .+     ECHO;
  <MAGIC>.+ { BEGIN 0; printf("Magic:"); ECHO; }

可以将没有起始状态的规则隐式地认为具有一个“通配符”起始状态,它们匹配
所有的起始状态。这常常是错误的根源。flex 和 lex 的其他新版本都有“惟一的
起始状态”,可以解决通配符问题。参见第七章的“起始状态”一节可以得到更多的详细资料。

2.yacc 语法分析程序调用 yyerror()(它在用户的子程序段提供),然后识别特殊的规则 error。

3.yacc无论词法分析程序何时将标记返回给语法分析程序,如果标记有相关的值,词法
分析程序在返回之前都必须在 yylval 中存储值。

 

你可能感兴趣的:(c)