【问题标题】:FLEX for generating AWK scanner - Identify Variables用于生成 AWK 扫描仪的 FLEX - 识别变量
【发布时间】:2012-09-24 14:44:50
【问题描述】:

我正在尝试使用 (F)Lex 分析为 AWK 源代码构建扫描器。我已经能够识别 AWK keyworkds、cmets、字符串文字和数字,但是我被困在如何生成正则表达式以匹配变量实例名称,因为它们是非常动态的。

有人可以帮我开发一个匹配 AWK 变量的正则表达式吗? http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html 提供 AWK 语言的定义。

变量必须以字母开头,但可以是字母数字,不区分大小写。唯一可以使用的特殊字符是下划线(“_”)。抱歉,我对 REGEX 不是很熟悉,更不用说 FLEX 的正则表达式了。

感谢您的帮助。

【问题讨论】:

  • 谢谢,这对我来说绝对是一个开始。如何将条件添加到正则表达式以匹配“如果不是关键字”,其中关键字定义为:KEYWORD BEGIN|delete|END|function|in|printf|break|do|exit|getline|next|return|continue| e‌​lse|for|if|print|while
  • 请务必搜索原始“The Awk 编程语言”中的 compat awk 脚本。它列出了(旧)awk 规范中的所有关键字/函数。旨在帮助那些迁移到(新)awk 的人在旧代码中查找名称冲突,但有一个很好的通用解决方案来查看 awk 代码并列出了许多函数/关键字。您可以使用新关键字轻松扩展它。 (就像交叉检查一样)。祝你好运。

标签: c regex awk flex-lexer


【解决方案1】:
[a-zA-Z_][a-zA-Z_0-9]*

以字母或下划线开头,后跟零个或多个字母数字或下划线。

特殊情况是字段,前缀为$:

$0
$1

还有

$NF
$i

您必须决定如何处理这些问题。

【讨论】:

  • 谢谢,这对我来说绝对是一个开始。如何将条件添加到正则表达式以匹配“如果不是关键字”,其中关键字定义为:KEYWORD BEGIN|delete|END|function|in|printf|break|do|exit|getline|next|return|continue| else|for|if|print|while
  • 要么将通用标识符的正则表达式放在关键字的正则表达式之后,要么编写通用标识符的规则,但让它识别通用标识符何时实际上是关键字并将标识符作为适当的关键字返回当它被发现时,当它不是关键字时作为标识符。后者是一种非常常见的策略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2010-11-23
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多