使用Flex检测和跳过行注释

如何在Flex中检测到像“//”这样的一行注释并跳过此行?

并且:

如果使用下面的“/ *”注释即可.它会起作用吗?

"/*"         { comment(); }
  %%

    comment()
    {
        char c,c1;
    loop:
        while ((c = input()) != '*' && c != 0)
            putchar(c);

        if ((c1 = input()) != '/' && c != 0)
        {
            unput(c1);
            goto loop;
        }

        if (c != 0)
            putchar(c1);
    }

解决方法

为什么不用正则表达式来识别注释? lex / flex的全部意义在于避免手动编写词法扫描器.您提供的代码应该可以工作(如果您将模式/ *放在行的开头),但它有点难看,并且它不会显而易见.

您的问题是要跳过注释,但您提供的代码使用putchar()来打印注释,但开头的/ *除外.你想做什么?如果要回显注释,可以使用ECHO操作而不是什么都不做.

以下是正则表达式:

单行评论

这个很容易,因为在lex / flex中.将不符合换行符.因此,以下内容将从//到行的末尾匹配,然后不执行任何操作.

"//".*                                    { /* DO NOTHING */ }

多行评论

这有点棘手,而且*是正则表达式字符以及注释标记的关键部分这一事实使得以下正则表达式有点难以阅读.我使用[*]作为识别字符*的模式;在flex / lex中,您可以使用“*”代替.使用您认为更具可读性的任何一种.本质上,正则表达式匹配以(字符串)*结尾的字符序列,直到找到下一个字符为/的字符串.换句话说,它具有与C代码相同的逻辑.

[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]       { /* DO NOTHING */ }

以上要求终止* /;未终止的注释将强制词法分析器返回到注释的开头并接受一些其他令牌,通常是/ division运算符.这可能不是你想要的,但是从未经评论评论中恢复并不容易,因为没有真正好的方法可以知道评论应该在哪里结束.因此,我建议添加错误规则:

[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]       { /* DO NOTHING */ }
[/][*]                                    { fatal_error("Unterminated comment"); }

相关文章

获取网络发布的webservice wsdl: http://www.flash-mx.com/ws/months.cfc?wsdl   GetMonths.mxml   ...
在开发四国军棋的游戏中,通过 flex联机游戏开发- 四国军棋游戏(五)-提炼棋类开发api,我们提炼出了第一...
  1.准备工具 Java SDK 1.5 或更高版本 Tomcat 6.0 或更高版本 Eclipse 3.3 或更高版本 Flex Builder ...
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="ht...
flex4 beta发布了,它是自flex3以来的重大改革。flex4 beta 提供了一种新的组件和皮肤的架构。作为一个...
     昨晚看了flex4中项目渲染器itemRenderer的知识,今天自己动手写一个,增强记忆,做一个简单类...