- 论坛徽章:
- 0
|
替你贴好了。链接总有失效的时候。
bc 命令
用途
为任意精度算术语言提供解释器。
语法
bc [ -c ] [ -l ] [ File ... ]
描述
bc 命令是一个提供任意精度算术的交互式进程。bc 命令首先读取由 File 参数指定的任一输入文件,然后读取标准输入。输入文件必须是包含 bc 命令能读取并执行的命令序列、语句或函数定义的文本文件。
bc 命令是 dc 命令的预处理程序。除非指定 -c(仅编译)标志,否则它自动调用 dc 命令。如果指定了 -c 标志,则来自 bc 命令的输出转到标准输出。
bc 命令允许您来指定十进制、八进制或十六进制的运算的输入和输出进制。缺省值为十进制。此命令还提供了十进制点符号的比例缩放规定。bc 命令始终使用 .(点号)来表示基数点,而不考虑指定为当前语言环境部分的任何十进制点字符。
bc 命令的语法类似于 C 语言的语法。可以使用 bc 命令通过将 ibase 关键字指定给输入进制而 obase 关键字指定给输出进制来在各进制间转化。2 到 16 的范围对于 ibase 关键字是有效的。obase 关键字的范围从 2 直到 /usr/include/sys/limits.h 文件中定义的 BC_BASE_MAX 值设置的限制。不考虑 ibase 和 obase 的设置,bc 命令将字母 A 到 F 识别为其十六进制值 10 到 15。
bc 命令的输出由读取程序控制。输出由包含所有执行的未赋值表达式的值的一行或多行构成。输出的基数和精度由 obase 和 scale 关键字的值控制。
有关 bc 命令处理来自源文件信息的方式的进一步的信息在以下各节中得到描述:
语法
词法约定
标识符和运算符
表达式
语句
函数调用
-I 数学库中的函数
语法
以下语法描述了 bc 程序的语法,其中 program 代表任何有效的程序:
%token EOF NEWLINE STRING LETTER NUMBER
%token MUL_OP
/* '*', '/', '%' */
%token ASSIGN_OP
/* '=', '+=', '-=', '*=', '/=', '%=', '^=' */
%token REL_OP
/* '==', '<=', '>=', '!=', '<', '>' */
%token INCR_DECR
/* '++', '--' */
%token Define Break Quit Length
/* 'define', 'break', 'quit', 'length' */
%token Return For If While Sqrt
/* 'return', 'for', 'if', 'while', 'sqrt' */
%token Scale Ibase Obase Auto
/* 'scale', 'ibase', 'obase', 'auto' */
%start program
%%
program : EOF
| input_item program
;
input_item : semicolon_list NEWLINE
| function
;
semicolon_list : /* empty */
| statement
| semicolon_list ';' statement
| semicolon_list ';'
;
statement_list : /* empty */
| statement
| statement_list NEWLINE
| statement_list NEWLINE statement
| statement_list ';'
| statement_list ';' statement
;
statement : expression
| STRING
| Break
| Quit
| Return
| Return '(' return_expression ')'
| For '(' expression ';'
relational_expression ';'
expression ')' statement
| If '(' relational_expression ')' statement
| While '(' relational_expression ')' statement
| '{' statement_list '}'
;
function : Define LETTER '(' opt_parameter_list ')'
'{' NEWLINE opt_auto_define_list
statement_list '}'
;
opt_parameter_list:/* empty */
| parameter_list
;
parameter_list : LETTER
| define_list ',' LETTER
;
opt_auto_define_list
: /* empty */
| Auto define_list NEWLINE
| Auto define_list ';'
;
define_list : LETTER
| LETTER '[' ']'
| define_list ',' LETTER
| define_list ',' LETTER '[' ']'
;
opt_argument_list : /* empty */
| argument_list
;
argument_list : expression
| argument_list ',' expression
;
relational_expression
: expression
| expression REL_OP expression
;
return_expression : /* empty */
| expression
;
expression : named_expression
| NUMBER
| '(' expression ')'
| LETTER '(' opt_argument_list ')'
| '-' expression
| expression '+' expression
| expression '-' expression
| expression MUL_OP expression
| expression '^' expression
| INCR_DECR named_expression
| named_expression INCR_DECR
| named_expression ASSIGN_OP expression
| Length '(' expression ')'
| Sqrt '(' expression ')'
| Scale '(' expression ')'
;
named_expression : LETTER
| LETTER '[' expression ']'
| Scale
| Ibase
| Obase
;词法约定
以下词法约定适用于 bc 命令:
bc 命令识别最长的可能的词法标记或在给定点开始的定界符。
以 /*(斜杠、星号)开始并以 */(星号、斜杠)结束的注释。注释仅对定界词法标记有效。
将换行字符识别为 NEWLINE 标记。
STRING 标记表示一个字符串常量。字符串以 "(双引号)开头并以 "(双引号)终止。引号间的所有字符都按照字面取出。无法指定包含 "(双引号)的字符串。每个字符串的长度限制为 limits.h 文件中定义的 BC_STRING_MAX 值设置的最大字节数。
空白字符仅当出现在 STRING 标志中或用来定界词法标记时才有效。
\n(反斜杠、换行)字符:
定界词法标记。
解释为 STRING 标记中的一个字符序列。
当作为多行 NUMBER 标记的一部分时被忽略。
NUMBER 标记使用以下语法:
NUMBER : integer
| '.' integer
| integer '.'
|integer '.' integer
;
integer : digit
| integer digit
;
digit : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
| 8 | 9 | A | B | C | D | E | F
;NUMBER 标记在 ibase 内部寄存器值指定的进制中解释为数字。
NUMBER 标记的值解释为由 ibase 内部寄存器的值指定的进制的数字。每个数字字符具有值 0 到 15(以这里列出的顺序排列),且句号字符表示基点。如果数字大于或等于出现在标记中的 ibase 寄存器的值,则行为未定义。对于指定给 ibase 和 obase 寄存器自己的单个位数的值,有一个例外。
将以下关键字识别为标记:
auto for length return sqrt
break ibase obase scale while
define if quit除了在关键字中,以下任何字母都看作是一个 LETTER 标记:
a b c d e f g h i j k l m n o p q r s t u v w x y z将以下单字符和双字符序列识别为 ASSIGN_OP 标记:
=(等号)
+=(加号、等号)
-=(减号、等号)
*=(星号、等号)
/=(斜杠、等号)
%=(百分号、等号)
^=(插入记号、等号)
将以下单字符识别为 MUL_OP 标记:
*(星号)
/(斜杠)
%(百分号)
将以下单字符和双字符序列识别为 REL_OP 标记:
==(双等号)
<=(小于号、等号)
>=(大于号、等号)
!=(感叹号、等号)
<(小于号)
>(大于号)
将以下双字符序列识别为 INCR_DECR 标记:
++(双加号)
--(双连字符)
将以下单字符识别为标记。标记和字符具有相同的名称:
<newline>
((左圆括号)
)(右圆括号)
,(逗号)
+(加号)
-(减号)
;(分号)
[(左方括号)
](右方括号)
^ (插入记号)
{ (左花括号)
} (右花括号)
当到达输入末尾时,返回 EOF 标记。
标识符和运算符
bc 命令可识别的标识符有三种:普通标识符、数组标识符和函数标识符。所有三种类型包含单个小写字母。数组标识符后跟 [ ](左和右方括号)。除了在参数中或自动列表中,数组下标是必需的。数组是单维构成的,且最多可包含 BC_DIM_MAX 值指定的数量。索引从 0 开始。所以数组从 0 开始建立索引值到 BC_DIM_MAX -1 定义的值。下标截断为整数。函数标识符必须后跟 ( )(左和右圆括号)并可能包含自变量。这三种标识符不冲突。
bc 程序表的运算符总结了优先规则和所有运算符的关联性的规则。同一行上的运算符具有相同的优先权。行以递减优先顺序排列。
bc 程序中的运算符
运算符 关联性
++, - - 不适用
unary - 不适用
^ 从右至左
*, /, % 从左至右
+,二进制 - 从左至右
=, +=, -=, *=, /=, ^= 从右至左
==, <=, >=, !=, <, > 无
每个表达式或命名表达式具有一个小数位,它是表达式小数部分要保留的十进制数字的位数。
命名表达式是存储值的位置。命名表达式在赋值的左边是有效的。命名表达式的值是存储于指定位置的值。简单的标识符和数组元素是命名表达式;它们具有一个为零的初始值和一个为零的初始小数位。
内部寄存器 scale、ibase 和 obase 都是命名表达式。包含这些寄存器之一的名称的表达式的小数位是 0。指定给这些寄存器任意之一的值将截断为整数。scale 寄存器包含一个用于计算表达式小数位的全局值(如下描述)。scale 寄存器的值限制为 0 <= scale <= {BC_SCALE_MAX} 并具有一个缺省值 0。ibase 和 obase 寄存器分别是输入和输出数字的基数。ibase 的值限制为 2 <= ibase <= 16。obase 的值限制为 2 <= obase = {BC_BASE_MAX} 。
当为 ibase 或 obase 寄存器指定了“词法约定”中描述的列表中的单个位数的值时,该值假定为十六进制。例如:
ibase=A 设置到底数十,而不考虑当前的 ibase 寄存器值。其它情况下,如果数字大于或等于出现在输入中的 ibase 寄存器的值,则行为未定义。ibase 和 obase 寄存器都具有初始值 10。
内部计算就像十进制(不考虑输入和输出底数)一样进行到指定的小数位个数。当没有得到精确的结果,例如:
scale=0; 3.2/1
bc 命令截断此结果。 |
|