2009-11-16 37 views
1

我正在考虑编写最佳方法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的查找功能,还有什么我需要 替换括号内的文字吗? 有没有人有任何建议或一些伪代码可能? 我知道这是一项复杂的任务,但仍然是最好的方法来做到这一点?

+1

C中的内置宏系统有什么问题?或者这是为了一些其他应用程序? – jimka 2009-11-16 05:35:00

+1

你为什么要用这个?你能用'gcc -E'来查看预处理输出吗? – jtbandes 2009-11-16 05:36:30

+1

绝对没有,我只是不会写简单的版本,就像练习一样,也不知道如何处理参数。 – paleman 2009-11-16 05:38:13

回答

1

宏处理器是非常有趣的,但可以成为一个艰难的野兽驯服(想想递归扩展,例如)。

你可以看一下现有的宏观处理器的执行类似M4(http://www.scs.stanford.edu/~reddy/links/gnu/m4.pdf)。

非常笼统,你将需要:

  • 解析器将首先从文件中提取的宏定义(从文件中删除它们,当然)
  • 另一个解析器,查明宏需要扩大和进行扩展(例如,你会想跳过字符串和注释!)

我觉得这是一个非常有趣的运动。正确的数据结构来处理这一切并不是微不足道的。

+0

我在我的c-libutl包中有一个非常简单的宏系统的例子。它不会完成所有你需要的功能,但如果它可能有用,你可以在这里找到它:http://code.google.com/p/c-libutl/source/browse/trunk/examples/macro/macro .c :) – 2009-11-16 10:44:08

+0

我会看看它,谢谢。 – paleman 2009-11-17 04:23:48

-1

2建议:

即 “不要在家里尝试这个” 预处理器。

+0

在这个问题上没有C++标签,所以Boost并不是一个合适的建议。 – caf 2009-11-16 06:33:23

+0

-1你的帖子绝不会回答OP的问题 – qrdl 2009-11-16 07:49:22

0

这是一个模式匹配问题,您应该先看一下regular expressions,然后当您掌握理论时,您可以继续阅读关于lexers的文章。

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

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

而且词法分析器是一个软件,做与匹配文本的东西,例如,用一些其他文字替换那段文字,基本上你看起来需要的东西。

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

+0

任何人都有建议,以纯粹的C正则表达式库? – jimka 2009-11-16 05:46:34

+1

PCRE? www.pcre.org – mlibby 2009-11-16 12:06:28