commit c759756d2e47cf2737949d0007937e467a4825eb
parent fee2f025d0e921966786fc8b0212f55674d35469
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date: Tue, 25 Nov 2025 11:21:47 +0100
bc: Implement the . operand
While it is not specified in POSIX, all the bc implementations since
70's store the last expression in the dot variable which can be used
in later experssions.
Diffstat:
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/bc.y b/bc.y
@@ -70,6 +70,7 @@ int cflag, dflag, lflag, sflag;
%token <str> STRING NUMBER
%token <str> EQOP '+' '-' '*' '/' '%' '^' INCDEC
%token HOME LOOP
+%token DOT
%token EQ
%token LE
%token GE
@@ -204,6 +205,7 @@ expr : nexpr
nexpr : NUMBER {$$ = code(" %s", $1);}
| ID {$$ = code("l%s", var($1));}
+ | DOT {$$ = code("l.");}
| SCALE {$$ = code("K");}
| IBASE {$$ = code("I");}
| OBASE {$$ = code("O");}
@@ -567,6 +569,8 @@ follow(int next, int yes, int no)
static int
operand(int ch)
{
+ int peekc;
+
switch (ch) {
case '\n':
case '{':
@@ -578,6 +582,12 @@ operand(int ch)
case ',':
case ';':
return ch;
+ case '.':
+ peekc = ungetc(getchar(), stdin);
+ if (strchr(DIGITS, peekc))
+ return number(ch);
+ yylval.str = ".";
+ return DOT;
case '"':
return string(ch);
case '*':
@@ -643,7 +653,7 @@ repeat:
yyerror("invalid input character");
} else if (islower(ch)) {
return iden(ch);
- } else if (ch == '.' || strchr(DIGITS, ch)) {
+ } else if (strchr(DIGITS, ch)) {
return number(ch);
} else {
if (ch == '/') {