Dan*_*ral 35
是的,YACC是一个解析器,Lex是一个词法分析器.它们通常一起使用:Lex字符串输入,YACC Lex提供的标记化输入.
现在,正则表达式只能表示常规语言.常规语言的一个限制是缺乏"记忆".您无法根据之前的内容在字符串中进一步定义接受规则.
这在括号中很明显.常规语言无法将嵌套括号与正确级别匹配.或任何其他此类结构.(大多数)计算机语言的语法可以做和做,并且因此,它们不能用Lexer或正则表达式解析.这就是YACC的用武之地.
人们也可以扭转这个问题.如果YACC可以做更多,为什么不用它进行词法分析呢?好吧,碰巧你可以非常有效地验证正则表达式的有效性,这不是一般语法的情况 - 不是同一级别.如果语言的词汇规则足够简单,YACC仍然可以进行基本的词法分析.
Chr*_*her 10
lex用于标记输入.也就是说,将输入分离为语法定义的最低级别对象.例如,您使用lex来标识关键字,标识符,字符串,注释,空格等.
yacc用于解析你的语法.语法是对您的语言的描述,通常在EBNF或其他一些无上下文语法中定义.一旦您将语法描述为yacc,就可以在识别语言元素时使用它来运行工具的操作.例如,这可能是构造用于表达式求解的语法树,定义范围对象,记录变量定义等等.
它们是免费产品.
Lex 是一个用于构建词法分析器的工具,它可以做一些相当愚蠢的词法工作(例如查找关键字)。Yacc 是一个解析器生成器,可以为真实的计算机语言创建解析器。它的分析通常基于 lex 的输出(它是一个标记流),并由此可以创建编程语言的解析树——这比 lex 的功能更多。
传统上,编译器构建者区分词法分析和句法分析——这是编译器中的两个重要步骤(还需要遵循进一步的步骤,例如代码创建、优化)。