2010-02-14 71 views
1

我有一个相对简单的lex/flex文件,并且已经用flex的调试标志运行它,以确保它正确地进行标记。不幸的是,我总是遇到以下两个问题之一 - 或者flex产生的程序停止在几个令牌之后静静地放弃,或者我用来识别字符和字符串的规则未被调用,并且默认规则被调用。lex(flex)生成的程序不解析整个输入

有人能指出我正确的方向吗?我附上了我的flex文件和示例输入/输出。

编辑:我发现生成的词法分析器在特定的规则之后停止:“cdr”。这更详细,但也更令人困惑。我发布了一个简短的修改过的lex文件。

/* lex file*/ 
%option noyywrap 
%option nodefault 

%{ 
     enum tokens{ 
       CDR, 
       CHARACTER, 
       SET 
     }; 
%} 

%% 

"cdr"            { return CDR; } 
"set"            { return SET; } 

[ \t\r\n]           /*Nothing*/ 
[a-zA-Z0-9\\[email protected]#$%^&*()\-_+=~`:;"'?<>,\.]  { return CHARACTER; } 

%% 

样品输入:

--(end of buffer or a NUL) 
--accepting rule at line 16 ("set") 
--accepting rule at line 18 (" ") 
--accepting rule at line 19 ("c") 
--accepting rule at line 18 (" ") 
--accepting rule at line 15 ("cdr") 

任何想法:

set c cdra + cdr b +() ; 

从通过生成的解析器运行输入输出完成?生成的程序在输入一半后放弃! (作为参考,我通过将文件内容重定向到生成的程序来进行输入)。

回答

3

当生成一个词法分析器这是独立的(即不是一个有标记的野牛/ yacc的定义是,你通常写在定义您的令牌文件顶部的枚举。但是,主循环一个lex程序,包括默认生成的主循环,看起来是这样的:

while(token = yylex()){ 
    ... 

这是罚款,直到你的词法分析器匹配第一次出现在枚举的规则 - 在这种特定的情况下,CDR因为由枚举。默认从零开始,这将导致while循环结束。重新编号您的枚举 - 将解决问题。

enum tokens{ 
      CDR = 1, 
      CHARACTER, 
      SET 
    }; 

短版:用手词法分析器定义的令牌的情况下,从1开始不是0

0

此规则

[-+]?([0-9*\.?[0-9]+|[0-9]+\.)([Ee][-+]?[0-9]+)? 
      | 

似乎只是第0-9后缺少一个右括号,我添加了一个|低于我认为应该达到的水平。我无法开始猜测flex如何对此作出回应。

我通常用于符号名称的规则是[a-zA-Z$_],这与您的不加引号的字符串 差不多,除非我通常允许符号内的数字,只要符号不以数字开头。

[a-zA-Z$_]([a-zA-Z$_]|[0-9])* 

字符只是一个短符号。我不认为它需要有自己的规则,但是如果有,那么你需要确保字符串规则至少需要2个字符。

[a-zA-Z$_]([a-zA-Z$_]|[0-9])+ 
+0

固定不匹配的方括号中,但没有运气。但是,我确实设法用一套较短的规则来重复这个问题。 – Zxaos 2010-02-14 15:47:09

+0

要回答lex如何反应,它只会失败规则并停止。由于方括号永远不匹配,所以从不声明有效的规则。 (9 *只会对9进行操作,并且不会太伤害程序) – Stegosaurus 2016-05-23 04:10:10