lex和yacc之间有什么区别

16 yacc lex

每当发现一些正则表达式时,我都使用lex来执行一些代码,Yacc可以做更多的事吗?如果是,那又怎样?

Dan*_*ral 35

是的,YACC是一个解析器,Lex是一个词法分析器.它们通常一起使用:Lex字符串输入,YACC Lex提供的标记化输入.

现在,正则表达式只能表示常规语言.常规语言的一个限制是缺乏"记忆".您无法根据之前的内容在字符串中进一步定义接受规则.

这在括号中很明显.常规语言无法将嵌套括号与正确级别匹配.或任何其他此类结构.(大多数)计算机语言的语法可以做和做,并且因此,它们不能用Lexer或正则表达式解析.这就是YACC的用武之地.

人们也可以扭转这个问题.如果YACC可以做更多,为什么不用它进行词法分析呢?好吧,碰巧你可以非常有效地验证正则表达式的有效性,这不是一般语法的情况 - 不是同一级别.如果语言的词汇规则足够简单,YACC仍然可以进行基本的词法分析.

  • 另一个可能更重要的原因是yacc通常不用于词法分析,因为这真的很麻烦.例如,识别Lex正则表达式中的浮点数的生成规则是1行,大约15个字符.等效的Yacc规则大约是10行,可能是150个字符. (2认同)

Nel*_*son 10

lex是一个词法分析器.它将文本拆分为令牌.它的功效大致相当于正则表达式匹配.yacc是一个解析器生成器.它需要一系列标记(例如,来自lex)并将它们解释为一系列语句.它的功效大致相当于无上下文语法.

lex和yacc的典型应用是用于实现编程语言.lex将输入标记为输入,将其分解为关键字,常量,标点符号等.然后yacc实现实际的计算机语言; 例如,识别for语句或函数定义.

实际上,您经常使用lex将输入文本处理成块.然后使用yacc将这些块串起来并将它们处理成更大的含义.


Chr*_*her 10

lex用于标记输入.也就是说,将输入分离为语法定义的最低级别对象.例如,您使用lex来标识关键字,标识符,字符串,注释,空格等.

yacc用于解析你的语法.语法是对您的语言的描述,通常在EBNF或其他一些无上下文语法中定义.一旦您将语法描述为yacc,就可以在识别语言元素时使用它来运行工具的操作.例如,这可能是构造用于表达式求解的语法树,定义范围对象,记录变量定义等等.

它们是免费产品.


Jue*_*gen 1

Lex 是一个用于构建词法分析器的工具,它可以做一些相当愚蠢的词法工作(例如查找关键字)。Yacc 是一个解析器生成器,可以为真实的计算机语言创建解析器。它的分析通常基于 lex 的输出(它是一个标记流),并由此可以创建编程语言的解析树——这比 lex 的功能更多。

传统上,编译器构建者区分词法分析和句法分析——这是编译器中的两个重要步骤(还需要遵循进一步的步骤,例如代码创建、优化)。