From a3bbd78e0f9e05102eb0483209bc6e2eccc07c39 Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Wed, 15 May 2019 19:54:29 -0400 Subject: Implement sizeof in order --- bin/man1/order.1 | 6 +++--- bin/order.y | 10 ++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/bin/man1/order.1 b/bin/man1/order.1 index 696a24d1..5a01ab4b 100644 --- a/bin/man1/order.1 +++ b/bin/man1/order.1 @@ -29,6 +29,6 @@ $ order 'a & b << 1' .Sh CAVEATS .Nm does not support the -.Sy (type) , -.Sy sizeof -or assignment operators. +.Sy (type) +operator +or the assignment operators. diff --git a/bin/order.y b/bin/order.y index fb5a052a..83d6a37f 100644 --- a/bin/order.y +++ b/bin/order.y @@ -21,6 +21,7 @@ #include #include #include +#include #include static void yyerror(const char *str) { @@ -43,7 +44,7 @@ static int yylex(void); %} -%token Var Arr Inc Dec Shl Shr Le Ge Eq Ne And Or +%token Var Arr Inc Dec Sizeof Shl Shr Le Ge Eq Ne And Or %left ',' %right '?' ':' @@ -57,7 +58,7 @@ static int yylex(void); %left Shl Shr %left '+' '-' %left '*' '/' '%' -%right '!' '~' Inc Dec +%right '!' '~' Inc Dec Sizeof %left '[' ']' Arr '.' %% @@ -81,6 +82,7 @@ expr: | '-' expr { $$ = fmt("(-%s)", $2); } | '*' expr { $$ = fmt("(*%s)", $2); } | '&' expr { $$ = fmt("(&%s)", $2); } + | Sizeof expr { $$ = fmt("(sizeof %s)", $2); } | expr '*' expr { $$ = fmt("(%s * %s)", $1, $3); } | expr '/' expr { $$ = fmt("(%s / %s)", $1, $3); } | expr '%' expr { $$ = fmt("(%s %% %s)", $1, $3); } @@ -116,6 +118,10 @@ static int yylex(void) { int len; for (len = 0; isalnum(input[len]) || input[len] == '_'; ++len); if (len) { + if (!strncmp(input, "sizeof", len)) { + input += len; + return Sizeof; + } yylval = fmt("%.*s", len, input); input += len; return Var; -- cgit 1.4.1