summaryrefslogtreecommitdiff
path: root/usr.bin/bc
diff options
context:
space:
mode:
authorOtto Moerbeek <otto@cvs.openbsd.org>2003-11-17 11:20:14 +0000
committerOtto Moerbeek <otto@cvs.openbsd.org>2003-11-17 11:20:14 +0000
commitbd9a861f74fcc6e081c5fa9effbee7d718b72138 (patch)
tree4a96ac2d55cb0c99a5622826f3abc14f1abf7658 /usr.bin/bc
parentf8f5b0f545d48e5210d806d5f8029b79e4b17895 (diff)
Implement non-portable extensions:
o boolean operators !, && and ||. o allow relational operators to appear in any expression, not just conditional expressions.
Diffstat (limited to 'usr.bin/bc')
-rw-r--r--usr.bin/bc/bc.y57
-rw-r--r--usr.bin/bc/scan.l8
2 files changed, 56 insertions, 9 deletions
diff --git a/usr.bin/bc/bc.y b/usr.bin/bc/bc.y
index b7646bdb5bb..0d89209b3fb 100644
--- a/usr.bin/bc/bc.y
+++ b/usr.bin/bc/bc.y
@@ -1,5 +1,5 @@
%{
-/* $OpenBSD: bc.y,v 1.18 2003/11/13 19:42:21 otto Exp $ */
+/* $OpenBSD: bc.y,v 1.19 2003/11/17 11:20:13 otto Exp $ */
/*
* Copyright (c) 2003, Otto Moerbeek <otto@drijf.net>
@@ -31,7 +31,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$OpenBSD: bc.y,v 1.18 2003/11/13 19:42:21 otto Exp $";
+static const char rcsid[] = "$OpenBSD: bc.y,v 1.19 2003/11/17 11:20:13 otto Exp $";
#endif /* not lint */
#include <ctype.h>
@@ -123,6 +123,9 @@ extern char *__progname;
%token SCALE IBASE OBASE AUTO
%token CONTINUE ELSE PRINT
+%left BOOL_OR
+%left BOOL_AND
+%nonassoc BOOL_NOT
%nonassoc EQUALS LESS_EQ GREATER_EQ UNEQUALS LESS GREATER
%right <str> ASSIGN_OP
%left PLUS MINUS
@@ -464,11 +467,7 @@ opt_relational_expression
;
relational_expression
- : expression
- {
- $$ = node($1, cs(" 0!="), END_NODE);
- }
- | expression EQUALS expression
+ : expression EQUALS expression
{
$$ = node($1, $3, cs("="), END_NODE);
}
@@ -492,6 +491,10 @@ relational_expression
{
$$ = node($1, $3, cs("!>"), END_NODE);
}
+ | expression
+ {
+ $$ = node($1, cs(" 0!="), END_NODE);
+ }
;
@@ -612,6 +615,46 @@ expression : named_expression
{
$$ = node($3, cs("X"), END_NODE);
}
+ | BOOL_NOT expression
+ {
+ $$ = node($2, cs("N"), END_NODE);
+ }
+ | expression BOOL_AND alloc_macro pop_nesting expression
+ {
+ ssize_t n = node(cs("R"), $5, END_NODE);
+ emit_macro($3, n);
+ $$ = node($1, cs("d0!="), $3, END_NODE);
+ }
+ | expression BOOL_OR alloc_macro pop_nesting expression
+ {
+ ssize_t n = node(cs("R"), $5, END_NODE);
+ emit_macro($3, n);
+ $$ = node($1, cs("d0="), $3, END_NODE);
+ }
+ | expression EQUALS expression
+ {
+ $$ = node($1, $3, cs("G"), END_NODE);
+ }
+ | expression UNEQUALS expression
+ {
+ $$ = node($1, $3, cs("GN"), END_NODE);
+ }
+ | expression LESS expression
+ {
+ $$ = node($3, $1, cs("("), END_NODE);
+ }
+ | expression LESS_EQ expression
+ {
+ $$ = node($3, $1, cs("{"), END_NODE);
+ }
+ | expression GREATER expression
+ {
+ $$ = node($1, $3, cs("("), END_NODE);
+ }
+ | expression GREATER_EQ expression
+ {
+ $$ = node($1, $3, cs("{"), END_NODE);
+ }
;
named_expression
diff --git a/usr.bin/bc/scan.l b/usr.bin/bc/scan.l
index 6b419ad5256..5bedbef2299 100644
--- a/usr.bin/bc/scan.l
+++ b/usr.bin/bc/scan.l
@@ -1,5 +1,5 @@
%{
-/* $OpenBSD: scan.l,v 1.12 2003/11/11 19:49:02 otto Exp $ */
+/* $OpenBSD: scan.l,v 1.13 2003/11/17 11:20:13 otto Exp $ */
/*
* Copyright (c) 2003, Otto Moerbeek <otto@drijf.net>
@@ -18,7 +18,7 @@
*/
#ifndef lint
-static const char rcsid[] = "$OpenBSD: scan.l,v 1.12 2003/11/11 19:49:02 otto Exp $";
+static const char rcsid[] = "$OpenBSD: scan.l,v 1.13 2003/11/17 11:20:13 otto Exp $";
#endif /* not lint */
#include <err.h>
@@ -125,6 +125,10 @@ DIGIT [0-9A-F]
"/" return DIVIDE;
"%" return REMAINDER;
+"!" return BOOL_NOT;
+"&&" return BOOL_AND;
+"||" return BOOL_OR;
+
"+" return PLUS;
"-" return MINUS;