m4posix - 云端在线

这是 m4posix 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


m4 — 宏处理器

概要


m4 [-s] [-D 姓名[=VAL]]... [-U 姓名]... 文件...

商品描述


m4 实用程序是一个宏处理器,它应该读取一个或多个文本文件,处理它们
根据其包含的宏语句,将结果写入标准输出。

配置


m4 实用程序应符合 POSIX.1-2008 的基本定义卷, 部分 12.2,
公用事业 句法 指南,除了顺序 -D-U 选项应为
重要,并且选项可以穿插操作数。

应支持以下选项:

-s 启用线路同步输出 c99 预处理器阶段(即
#线 指令)。

-D 姓名[=VAL]
确定 姓名VAL 或 null if =VAL 被省略。

-U 姓名 取消定义 姓名.

操作数


应支持以下操作数:

文件 要处理的文本文件的路径名。 如果不 文件 给出,或者如果它是 '-',
应读取标准输入。

标准输入


标准输入应该是一个文本文件,如果没有 文件 给出操作数,或者如果它
is '-'.

INPUT FILES


命名的输入文件 文件 操作数应为文本文件。

环境 变数


以下环境变量会影响执行 m4:

为未设置或未设置的国际化变量提供默认值
空值。 (参见 POSIX.1-2008 的基本定义卷, 部分 8.2,
国际化 变量 为国际化优先
用于确定语言环境类别值的变量。)

LC_ALL 如果设置为非空字符串值,则覆盖所有其他字符串的值
国际化变量。

LC_CTYPE 确定用于解释文本数据字节序列的语言环境
作为字符(例如,单字节而不是多字节字符
参数和输入文件)。

LC_消息
确定应该用于影响格式和内容的语言环境
写入标准错误的诊断消息。

路径 确定用于处理的消息目录的位置 LC_消息.

异步 新闻


默认。

标准输出


标准输出与输入文件相同,经过宏处理后
扩张。

斯特德


标准错误应用于显示字符串 错误打印 宏,宏跟踪
跟踪 宏,由编写的宏定义的文本 转储定义 宏,或
用于诊断消息。

OUTPUT FILES


没有。

EXTENDED 商品描述


m4 实用程序应将输入中的每个令牌与一组内置和
用户定义的宏。 如果令牌与宏的名称匹配,则令牌应为
由宏的定义文本(如果有)替换,并重新扫描匹配的宏名称。
一旦令牌的任何部分都与宏的名称不匹配,则应将其写入标准
输出。 宏可能有参数,在这种情况下,参数应被替换为
重新扫描之前的定义文本。

宏调用具有以下形式:

姓名(参数1, 参数2,..., 精氨酸)

宏名称应由字母、数字和下划线组成,其中第一个字符
不是数字。 不属于这种形式的令牌不应被视为宏。

申请应确保紧跟在名字后面
宏。 如果与宏名称匹配的标记后面没有跟
括号>,它被处理为不带参数的宏的使用。

如果宏名称后跟,它的参数是
- 之间的分隔标记和匹配
括号>。 每个参数前的未加引号的空白字符将被忽略。
保留所有其他字符,包括尾随空白字符。
中间包含的字符和字符不
分隔参数。

参数是按位置定义和引用的。 字符串 “ $ 1” 在定义文本中
应替换为第一个参数。 系统应支持至少九个参数;
只能引用前九个,使用字符串 “ $ 1”“ $ 9”, 包括的。 这
绳子 “ $ 0” 替换为宏的名称。 字符串 “ $#” 被替换为
作为字符串的参数数量。 字符串 “$*” 被所有的列表替换
参数,由人物。 字符串 “$@” 替换为所有列表
由分隔的参数字符,并且每个参数都使用
当前的左右引用字符串。 字符串 “${” 产生未指定的行为。

如果提供的参数少于宏定义中的参数,则省略的参数
被视为空值。 如果提供的参数多于
宏定义。

匹配的左和右之间的任何字符都没有特殊含义
引用字符串,但引用字符串本身被丢弃。 默认情况下,左
引用字符串由重音符(反引号)和正确的引用字符串组成
由一个重音(单引号)组成; 另见 更改报价 宏。

注释已写入但未扫描以查找匹配的宏名称; 默认情况下,开始 -
注释字符串由字符和结束注释字符串组成
的. 另见 更改通讯域名 宏。

m4 实用程序应提供以下内置宏。 它们可以重新定义,
但是一旦这样做了,原来的意思就丢失了。 它们的值应为空,除非
另有说明。 在下面的描述中,术语 定义 文本 指的是价值
宏:第二个参数 定义 宏等等。 除了
第一个论点 评估 宏,内置宏的所有数字参数都应为
解释为十进制值。 作为定义文本生成的字符串值
递减, 提单, 增量, 指数, LEN系统值 内置宏应采用以下形式
C 语言中定义的十进制常量。

更改通讯 更改通讯 宏应设置开始注释和结束注释字符串。 没有
论据,评论机制应被禁用。 有一个非空
参数,该参数将成为开始评论和将
成为结束注释字符串。 有两个非空参数,第一个参数
应成为开始注释字符串,第二个参数应成为
结束注释字符串。 如果提供任一参数,则行为未指定
但为空。 系统应支持至少五个字符的注释字符串。

更改报价
更改报价 宏应设置开始引号和结束引号字符串。 没有
参数,引号字符串应设置为默认值(即`')。
如果有一个参数或任一参数是未指定的行为
空值。 有两个非空参数,第一个参数应成为开始——
引号字符串和第二个参数应成为结束引号字符串。 系统
应支持至少五个字符的引号字符串。

递减 的定义文本 递减 宏应该是它的第一个参数递减
1. 指定包含任何非数字的参数是错误的
人物。 行为是未指定的,如果 递减 没有立即跟随
一种.

定义 第二个参数应成为宏的定义文本,其名称为
第一个论点。 未指明是否 定义 宏删除所有先前
由其第一个参数命名的宏的定义或保留除
宏的当前定义。 行为是未指定的,如果 定义 是不是
紧接着是一个.

定义 的定义文本 定义 宏应是引用的定义(使用
当前引用字符串)的参数。 行为是未指定的,如果 定义
不是紧随其后的是.

转移 m4 实用程序维护九个临时缓冲区,编号为 1 到 9,包括 XNUMX 到 XNUMX。
处理完最后一个输入后,已放置的任何输出
在这些缓冲区中,应按缓冲区数字顺序写入标准输出。
转移 宏应将未来的输出转移到其指定的缓冲区
争论。 不指定参数或参数为 0 将恢复正常
输出过程。 转移到负数流的输出应为
丢弃。 如果流编号大于 9,则行为是实现定义的
被指定。 指定包含任何非
数字字符。

提单 的定义文本 提单 宏应为当前输出的编号
作为字符串流。

域名 域名 宏将导致 m4 丢弃所有输入字符,包括
下一个.

转储定义 转储定义 宏应将定义的文本写入每个
指定为参数的宏,或者,如果没有指定参数,则为所有
宏。

错误打印 错误打印 宏应将其参数写入标准错误。 行为是
未指明是否 错误打印 不是紧随其后的是.

评估 评估 宏应将其第一个参数评估为算术表达式,
使用至少 32 位精度的带符号整数算法。 至少
应优先支持以下 C 语言运算符,
关联性和行为,如 部分 1.1.2.1, 算术
平台精度 运营:

()
一元 +
一元 -
~

!
二进制 *
/
%
二进制 +
二进制 -
<<
>>
<
<=
>
>=
==
!=
二进制 &
^
|
&&
||

系统应支持 ISO C 标准中的八进制和十六进制数。
如果指定了第二个参数,则应设置结果的基数; 如果
参数为空或未指定,默认为 10。如果行为未指定
基数不在 2 到 36 的范围内,包括 XNUMX 到 XNUMX。 第三个参数,如果
指定,设置结果中的最小位数。 行为是
如果第三个参数小于零,则未指定。 将是一个错误
指定包含任何非数字字符的第二个或第三个参数。 这
行为是未指定的,如果 评估 不是紧随其后的是
括号>。

如果定义 如果第一个参数 如果定义 宏已定义,定义文本应为
第二个论点。 否则,定义文本应为第三个参数,
如果指定,或者空字符串,如果没有。 行为是未指定的,如果 如果定义
不是紧随其后的是.

如果别的 如果别的 宏需要三个或更多参数。 如果前两个参数
比较为相等的字符串(在两个参数的宏扩展之后),定义
text 应为第三个参数。 如果前两个参数不比较为
相等的字符串并且有三个参数,定义文本应为空。 如果
前两个参数不作为相等的字符串进行比较,并且有四个或
五个参数,定义文本应为第四个参数。 如果前两个
参数不作为相等的字符串进行比较,并且有六个或更多参数,
前三个参数应被丢弃,处理应重新开始
剩下的论点。 行为是未指定的,如果 如果别的 是不是
紧接着是一个.

包括 定义文本 包括 宏应该是名为的文件的内容
由第一个论点。 如果无法读取文件,则为错误。 这
行为是未指定的,如果 包括 不是紧随其后的是
括号>。

增量 的定义文本 增量 宏应该是它的第一个参数递增
1. 指定包含任何非数字的参数是错误的
人物。 行为是未指定的,如果 增量 没有立即跟随
一种.

指数 的定义文本 指数 宏应为第一个字符位置(作为
string) 在第一个参数中,其中匹配第二个参数的字符串开始
(零原点),如果第二个参数没有出现,则为 -1。 行为是
未指明是否 指数 不是紧随其后的是.

LEN 的定义文本 LEN 宏应为长度(作为字符串)
第一个论点。 行为是未指定的,如果 LEN 没有立即跟进
由一个.

退出 退出 m4 公用事业。 如果指定了第一个参数,则为出口
代码。 默认值为零。 指定参数应该是错误的
包含任何非数字字符。

m4包装 当达到 EOF 时,将处理第一个参数。 如果 m4包装
多次使用,指定的参数应按顺序处理
其中 m4包装 宏已处理。 行为是未指定的,如果 m4包装
不是紧随其后的是.

临时工 定义文本应是第一个参数,任何尾随 'X' 字符
替换为字符串形式的当前进程 ID。 行为未明确
if 临时工 不是紧随其后的是.

马克斯坦普 第一个参数应作为创建空文件的模板,其中
尾随 'X' 字符替换为可移植文件名中的字符
字符集。 如果第一个参数不以
至少六个 'X' 人物。 如果临时文件创建成功,则
宏的定义文本应为新文件的名称。 用户标识
文件名应设置为进程的有效用户ID。 组标识
文件的组 ID 应设置为文件的父目录的组 ID 或
进程的有效组 ID。 设置文件访问权限位
这样只有所有者才能读取和写入文件,而不管
当前 遮罩 的过程。 如果无法创建文件,则定义文本
宏应为空字符串。 行为是未指定的,如果 马克斯坦普
不是紧随其后的是.

弹出定义 弹出定义 宏应删除其参数的当前定义,替换
该定义与前一个相同。 如果之前没有定义,则
宏未定义。 行为是未指定的,如果 弹出定义 不是立即
紧接着一个.

推定义 推定义 宏应等价于 定义 宏除外
它应保留任何当前定义以供将来使用
弹出定义 宏。 行为是未指定的,如果 推定义 没有立即跟进
由一个.

转移 定义文本 转移 宏应是其逗号分隔的列表
除了第一个参数。 每个参数都应使用当前的引用
引用字符串。 行为是未指定的,如果 转移 不是立即
紧接着一个.

包括 包括 宏应等价于 包括 宏,除了它
如果文件不可访问,则不应是错误。 行为未明确
if 包括 不是紧随其后的是.

子字符串 定义文本 子字符串 宏应该是第一个的子串
从第二个指定的零偏移字符位置开始的参数
争论。 第三个参数,如果指定,应为字符数
选择; 如果不指定,从起点到终点的字符
第一个参数应成为定义文本。 这不会是一个错误
指定超出第一个参数结尾的起点和定义
文本应为空。 指定包含任何参数的参数应该是错误的
非数字字符。 行为是未指定的,如果 子字符串 是不是
紧接着是一个.

系统命令 系统命令 宏应将其第一个参数解释为 shell 命令行。 这
定义文本应为该命令的字符串结果。 字符串结果
设置定义文本时不应重新扫描宏。 无输出
重定向应由 m4 公用事业。 退出状态值来自
命令可以使用 系统值 宏。 行为是未指定的,如果
系统命令 不是紧随其后的是.

系统值 的定义文本 系统值 宏应为实用程序的退出值
最后调用 系统命令 宏(作为字符串)。

跟踪 跟踪 宏应启用对指定为参数的宏的跟踪,
或者,如果没有指定参数,则为所有宏。 跟踪输出应为
以未指定的格式写入标准错误。

追踪 追踪 宏应禁用对指定为参数的宏的跟踪,
或者,如果没有指定参数,则为所有宏。

TRANSLIT 的定义文本 TRANSLIT 宏应该是每个的第一个参数
出现在第二个参数中的字符替换为相应的
来自第三个参数的字符。 如果没有指定替换字符
某些源字符,因为第二个参数比第三个参数长
参数,该字符应从第一个参数中删除 TRANSLIT's
定义文本。 行为是未指定的,如果 '-' 字符出现在
除了第一个或最后一个字符之外的任何地方的第二个或第三个参数。 这
如果同一字符在
第二个论点。 行为是未指定的,如果 TRANSLIT 不是立即
紧接着一个.

取消定义 取消定义 宏应删除所有定义(包括使用
推定义 宏)由其参数命名的宏。 行为是
未指明是否 取消定义 不是紧随其后的是.

不转移 不转移 宏应立即输出临时缓冲区中的任何文本
命名为参数,或所有临时缓冲区,如果没有指定参数。
缓冲区可以不转入其他临时缓冲区。 不改道须
丢弃临时缓冲区的内容。 行为是未指定的,如果
参数包含任何非数字字符。

退出 状态


应返回以下退出值:

0 成功完成。

>0 发生错误

如果 退出 使用宏,退出值可以由输入文件指定。

后果 OF 错误


默认。

以下 部分 ,那恭喜你, 内容丰富。

申请须知 用法


定义 宏对于重命名宏很有用,尤其是内置宏。

评估 按照 ISO C 标准,某些操作具有未定义的行为。 在一些
实现,除法或余数为零会导致致命信号,即使除法
发生在短路的分支上 “&&” or “||”. 任何溢出的操作
有符号算术产生未定义的行为。 同样,使用 转移 运营商与
不为正且小于精度的移位量未定义,原样
将负数向右移动。 从历史上看,并非所有实现都遵循 C-
语言优先规则: '~''! 均低于 '=='; '==''!=' 不低
'<';和 '|' 不低于 '^'; 自由使用 “()” 可以强制想要的
即使这些不合规的实现也优先。 此外,一些传统的
处理的实现 '^' 作为幂运算符,尽管大多数实现
现在使用 “**” 作为此目的的扩展。

当一个宏通过 推定义 宏,未指定是否
定义 宏只会改变最近的定义(就像 弹出定义
推定义),或者用一个定义替换整个定义堆栈(好像
by 取消定义推定义)。 需要特定行为的应用程序 定义
在这种情况下,宏可以相应地重新定义它。

应用程序应使用 马克斯坦普 宏而不是过时的 临时工 宏为
创建临时文件。

示例


如果文件 m4src 包含以下行:

折扣值 of 'VER' is “VER”。
ifdef(`VER', ``VER'' is 定义 be 版本, VER is 不能 定义。)
ifelse(版本, 1, ``VER'' is 'VER'。)
ifelse(版本, 2, ``VER'' is 'VER'., ``VER'' is 不能 2)。
结束

然后命令

m4 m4src

或命令:

m4 -U VER m4src

产生输出:

折扣值 of VER is “VER”。
VER is 不能 定义。

VER 不是 2。
结束

命令:

m4 -D VER m4src

产生输出:

折扣值 of VER is “”。
VER is 定义 be .

VER 不是 2。
结束

命令:

m4 -D 版本=1 m4src

产生输出:

折扣值 of VER is “ 1年XNUMX月XNUMX日”。
VER is 定义 be 1.
VER is 1.
VER is 不能 2.
结束

命令:

m4 -D 版本=2 m4src

产生输出:

折扣值 of VER is “ 2年XNUMX月XNUMX日”。
VER is 定义 be 2.

VER 为 2。
结束

基本原理


已处理基于历史系统 V 的行为 “${” 在宏定义中作为两个字面量
人物。 但是,此序列未指定,因此实现可能会提供
扩展如 “${11}” 表示第十一个位置参数。 宏还是可以的
通过适当使用嵌套引用来定义以生成文字 “${” 在输出中
重新扫描后删除嵌套的引号。

TRANSLIT 内置的、历史性的基于 System V 的行为处理 '-' 作为字面意思; GNU
行为将其视为一个范围。 此版本的标准允许任何一种行为。

未来 如何前往


没有。

使用 onworks.net 服务在线使用 m4posix



最新的 Linux 和 Windows 在线程序