正则表达式可以用来表达各种词法解析器的要求吗?
Regular expression can be used to express all kinds of lexical parser requirements?
最近在学习编译原理。我注意到教科书中的所有示例都描述了使用 "lex" 或 "flex" 和正则表达式的语言词法解析器,以展示如何分析输入源文件。
是否表明,所有已知的编程语言,都可以使用类型 3 语法来实现词法分析?还是教科书只是用简单的例子来展示想法?
大多数语言中的大部分词位都可以用正则表达式来识别,但也有例外。 (说到解析计算机语言,总有例外。无一例外。)
例如,您不能将 C++ 原始字符串文字与正则表达式相匹配。如果不进行句法分析,您无法判断 Javacript 程序中的 /=
是否是用于指示分而治之的单个词素,或者它是否是匹配以 开头的 atring 的正则表达式的开头=。允许嵌套注释的语言(与 C 不同)需要更强大的功能。
但是写几个正则表达式比用原始 C 语言写一个完整的状态机要容易得多,所以有很多动机去寻找在一些特殊情况下屈服于你的意志的方法。和 flex 在一定程度上合作,提供一些特性,让你在必要时摆脱正则表达式的束缚。在有关词法分析的高级 class 中,您可能会了解有关这些功能的更多信息。
最近在学习编译原理。我注意到教科书中的所有示例都描述了使用 "lex" 或 "flex" 和正则表达式的语言词法解析器,以展示如何分析输入源文件。
是否表明,所有已知的编程语言,都可以使用类型 3 语法来实现词法分析?还是教科书只是用简单的例子来展示想法?
大多数语言中的大部分词位都可以用正则表达式来识别,但也有例外。 (说到解析计算机语言,总有例外。无一例外。)
例如,您不能将 C++ 原始字符串文字与正则表达式相匹配。如果不进行句法分析,您无法判断 Javacript 程序中的 /=
是否是用于指示分而治之的单个词素,或者它是否是匹配以 开头的 atring 的正则表达式的开头=。允许嵌套注释的语言(与 C 不同)需要更强大的功能。
但是写几个正则表达式比用原始 C 语言写一个完整的状态机要容易得多,所以有很多动机去寻找在一些特殊情况下屈服于你的意志的方法。和 flex 在一定程度上合作,提供一些特性,让你在必要时摆脱正则表达式的束缚。在有关词法分析的高级 class 中,您可能会了解有关这些功能的更多信息。