【问题标题】:C macro processingC 宏处理
【发布时间】:2009-11-16 05:32:11
【问题描述】:

我正在考虑编写能够处理宏的 C 定义处理器的最佳方法。不幸的是,我没有想到任何聪明的东西。 它的行为应该与 C 中的完全一样,因此它处理如下表达式:

#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, b));

或者这个:

#define F 10
#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, F));

我知道 K&R2 的安装和查找功能,我还需要什么 替换括号内的文本? 有没有人有任何建议或一些伪代码? 我知道这是一项复杂的任务,但是,最好的方法是什么?

【问题讨论】:

  • C 内置宏系统有什么问题?还是用于其他应用程序?
  • 为什么要使用这个?你可以用gcc -E 来查看预处理后的输出吗?
  • 绝对没有,我只是不会写和练习一样的简单版本,也不知道如何处理参数。
  • 看看其他人是如何解决这个问题的:cabaret.demon.co.uk/filepp
  • 那些宏定义很糟糕 - 在替换文本中的每个 'a' 和 'b' 周围使用括号。

标签: c macros c-preprocessor kernighan-and-ritchie


【解决方案1】:

宏处理器非常有趣,但也可能成为难以驯服的野兽(例如,考虑递归扩展)。

您可以查看现有宏处理器的实现,例如 M4 (http://www.scs.stanford.edu/~reddy/links/gnu/m4.pdf)。

一般来说,您需要:

  • 一个解析器,它将首先从您的文件中提取宏定义(当然是从文件中删除它们)
  • 另一个解析器,用于识别宏需要在哪里扩展并执行扩展(例如,您将要跳过字符串和 cmets!)

我认为这是一个非常有趣的练习。处理这一切的正确数据结构并非易事。

【讨论】:

【解决方案2】:

这是一个模式匹配问题,你应该先看看regular expressions,然后当你掌握了理论之后你可以继续阅读lexers

正则表达式基本上是将字符串与预定义的模式匹配。

一些正则表达式(正则表达式的缩写)软件/库:
- Boost.Regexp
- GNU C library regexp
- PCRE

词法分析器是一种软件,它对匹配的文本执行某些操作,例如,用其他文本替换该文本,基本上是您似乎需要的。

一些已知的词法分析器:
- flex
- Boost.Wave

【讨论】:

  • 有人对纯 C 正则表达式库有建议吗?
【解决方案3】:

2 条建议:

即“不要在家里尝试这个”。

【讨论】:

  • 这个问题没有 C++ 标签,所以 Boost 不是一个合适的建议。
猜你喜欢
  • 2020-02-09
  • 2011-01-26
  • 1970-01-01
  • 2015-05-08
  • 2012-11-16
  • 2016-12-14
  • 2011-03-26
  • 2018-01-04
  • 2016-09-16
相关资源
最近更新 更多