yymore & yyless

1) yymore()
  当需下一次被匹配的字符串被添加在当前识别出的字符串后面,即不使下一次的输入替换yytext中已有的内容而是接在它的内容之后,必须在当前的动作中调用yymore()
  例 假设一个语言规定它的字符串括在两个双引号之间,如果某字符串中含有双引号,则在它前面加上反斜线\。用一个正规式来表达该字符串的定义很不容易,不如用下面较简明的正规式与yymore()配合来识别:
  \"[∧"]{
       if (yytext[yyleng-1]==′\\′yy
       more();
       else
        …normal user processing
       }
  当输入串为"abc\"def"时,上述规则首先与前5个字符"abc\匹配,然后调用yymore()使余下部分"def被添加在前一部分之后,注意作为字符串结尾标志的那个双引号由"normal user processing"部分负责处理
  2) yyless(n)
  如果当前匹配的字符串的末尾部分需要重新处理,那么可以调用yyless(n)将这部分子串"退回"给输入串,下次再匹配处理。yyless(n)中的n是不退回的字符个数,即退回的字符个数是yyleng-n。
  例 在C语言中。=-a"具有二义性,假定要把它解释为"=-a",同时给出信息,可用下面的识别规则:
  =-[a-zAZ]{
        printf("Operator (=-)
        ambiguous\n");
        yyless(yyleng-1);
        …action for =-…
        }
上面的规则先打印出一条说明出现二义性的信息,将运算符后面的字母退回给输入串,最后将运算符按"=-"处理。另外,如果希望把"=-a"解释为″=-a″,这只需要把负号与字母一起退回给输入串等候下次处理,用下面的规则即可:
  =-[a-zAZ]{
        printf("Operator (=-)
        ambiguous\n");
        yyless (yyleng-1);
        …action for =…
        }
  3) yywrap()
  当LEX处理到输入串的文件尾时,自动地调用yywrap(),如果yywrap()返回值是1,那么LEX就认为对输入的处理完全结束,如果yywrap()返回的值是0,LEX就认为有新的输入串等待处理。
  LEX自动提供一个yywrap(),它总是返回1,如果用户希望有一个返回0的yywrap(),那么就可以在"用户子程序部分"自己写一个yywrap(),它将取代LEX自动提供的那个yywrap(),在用户自己写的yywrap()中,用户还可以作其它的一些希望在输入文件结束处要作的动作,如打印表格。输出统计结果等,使用yywrap()的例子在后面举出。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值