这是 cpphs-hugs 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
cpphs - 为 Haskell 开放的类似 cpp 的预处理器
概要
CPPHs [文件名|OPTION] ...
商品描述
CPPHs 是一种自由化的重新实施 CPP (1) C 预处理器,in 和 for
哈斯克尔。
为什么要重新实现cpp? 不管对错,C 预处理器在 Haskell 中被广泛使用
源代码。 它为不同的编译器、不同的编译器启用条件编译
相同编译器的版本和不同的操作系统平台。 它也偶尔使用
因为它的宏语言,它可以启用某些形式的特定于平台的细节——
填充,例如繁琐的实例定义和 FFI 样板生成
声明。 但是,除了明显的审美之外,cpp还有两个问题
那些:
对于某些 Haskell 系统,尤其是 Windows 上的 Hugs,真正的 cpp 无法通过
默认。
即使对于其他 Haskell 系统,gcc 3.x 系列提供的通用 cpp
正在以与 Haskell 语法不兼容的方式微妙地改变。 有
一直存在问题,例如字符串间隙和素数字符
身份标识。 这些问题只会变得更糟。
因此,尝试提供 cpp 的替代品似乎是正确的,两者都与
Haskell,并且它本身是用 Haskell 编写的,以便它可以与编译器一起分发。
CPPHs 功能非常齐全,并与 -传统 cpp的风格。
它有两种模式:
仅条件编译 (--诺宏),
和完整的宏扩展(默认)。
In --诺宏 模式, CPPHs 只执行条件编译动作,即 的#include的,
#如果的,和 #ifdef的根据文本替换定义进行处理(命令-
行和内部),但不执行参数化宏扩展。 在全
兼容模式(默认)、文本替换和宏扩展也是
在非 cpp 文本的剩余正文中处理。
工作特点:
#ifdef 简单的条件编译
#如果 defined()、&&、||、== 等的完整布尔语言。
#elif 链式条件
#定义
内嵌定义(文本替换和宏)
#undef 在线撤销定义
的#include
文件包含
#线 行号指令
\n 所有 # 指令中的行延续
/ ** / 宏定义中的标记串联
## ANSI 样式的令牌链接
# ANSI 风格的令牌字符串化
__文件__
DIY 错误消息的特殊文本替换
__线__
DIY 错误消息的特殊文本替换
__日期__
特殊文本替换
__时间__
特殊文本替换
宏展开是递归的。 重新定义宏名称不会产生警告。
可以在命令行上定义宏 -D 就像文本替换一样。 宏
名称可以是 Haskell 标识符,例如带有主要的 ` 和反引号 ´
字符,比 C 中稍微宽松一些,但它们仍然可能不包含运算符
符号。
保留输出中的行数,以便任何后来的处理器都可以给出
有意义的错误信息。 当一个文件是 的#include'd, CPPHs 插件 #线 指令
同样的原因。 即使存在续行,编号也应该是正确的。
如果你不想 #线 指令在最终输出中,使用 --诺琳 选项。
cpp 指令中的任何语法错误都会向 stderr 发出消息并停止程序。
找不到 #include 文件会向 stderr 发出警告,但处理仍在继续。
您可以在命令行上提供任意数量的文件名。 结果被链接到
标准输出。
-D符号 定义文本替换(默认值为 1)
-Dsym=VAL
定义具有特定值的文本替换
-I径 为#include 的搜索路径添加一个目录
-O文件 指定输出文件(默认为标准输出)
--诺宏
只处理 #ifdef 和 #include,
不要扩展宏
--诺琳
从输出中删除 #line 丢弃
- 跳闸
将 C 风格的注释转换为空白,甚至在外部
cpp 指令
--哈希
识别 ANSI # stringise 操作符,以及 ## for
宏内的标记串联
- 文本 将输入视为纯文本,而不是 Haskell 代码
- 布局
在宏扩展中保留换行符
--未点亮
删除文学风格的评论
- 版
报告cpphs的版本号并停止
默认情况下没有定义文本替换。 (正常的cpp通常有定义
用于机器、操作系统等。如果您愿意,这些可以很容易地添加到 cpphs 源代码中。)
搜索路径按顺序搜索 -I 选项,除了目录
调用文件,然后是当前目录,总是首先搜索。 再次,没有
默认搜索路径(同样,这可以轻松更改)。
差异性 从 CPP
一般来说,cpphs 是基于 -传统 行为,而不是 ANSI C,并且具有
以下与标准 cpp 的主要区别。
一般用途总体评估
这款 # 引入任何 cpp 指令必须在一行的第一列(而
ANSI 允许在 # ).
生成 #线 n "文件名" 语法,而不是 # n "文件名" 变种。
C 注释仅从 cpp 指令中删除。 他们没有从其他人身上剥离
文本。 考虑例如在 Haskell 中,以下所有操作都是有效的
符号: /* */ * / * 但是,您可以使用 - 跳闸 选项。
宏 语言
接受 / ** / 用于宏定义中的标记粘贴。 然而, /* */ (任何文字
在打开/关闭注释之间)插入空格。
ANSI ## 令牌粘贴运算符可用于 --哈希 旗帜。 这是为了避免
误解任何同名的有效 Haskell 运算符。
将宏形参替换为实际的,甚至在字符串内部(双精度或单精度)
引)。 这是 - 传统行为,ANSI 不支持。
承认 # 仅当您使用 --哈希
选项。 (这是一个 ANSI 添加,只需要因为引用的字符串化(上面)是
ANSI 禁止。)
完全保留文本替换定义中的空格(模换行符),
但消除了前导和尾随空格。
精确地(模
换行符),但消除了前导空格。
完全保留宏调用参数中的空格(包括换行符),但前导
并消除尾随空格。
随着 - 布局 选项,文本替换或宏定义中的行延续
在宏调用中保留为换行符。 (对于布局敏感的代码很有用
哈斯克尔。)
使用 onworks.net 服务在线使用 cpphs-hugs