From 83104b7b697b6bc2d4787a0cb0ea4708dbe9c7a6 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sun, 23 Aug 2020 07:55:41 +1000 Subject: [PATCH] Setup operator precedence for parser to avoid ambiguity and fix shift/reduce warnings --- src/sql/lexer.l | 11 +++++++---- src/sql/parser.y | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/sql/lexer.l b/src/sql/lexer.l index 7a2123c..5bea481 100644 --- a/src/sql/lexer.l +++ b/src/sql/lexer.l @@ -50,25 +50,28 @@ struct sql_context; %% -select { return SELECT; } +select { return SELECT; } from { return FROM; } connect { return CONNECT; } disconnect { return DISCONNECT; } to { return TO; } list { return LIST; } where { return WHERE; } -tables { return TABLES; } -table { return TABLE; } +tables { return TABLES; } +table { return TABLE; } describe { return DESCRIBE; } and { return AND; } or { return OR; } not { return NOT; } is { return IS; } null { return NUL; } +"=" { return EQ; } (<=) { return LTEQ; } (>=) { return GTEQ; } +"<" { return LT; } +">" { return GT; } like { return LIKE; } -limit { return LIMIT; } +limit { return LIMIT; } count { return COUNT; } strptime { return STRPTIME; } [ \t\r] ; diff --git a/src/sql/parser.y b/src/sql/parser.y index 2effb96..0524bf1 100644 --- a/src/sql/parser.y +++ b/src/sql/parser.y @@ -71,6 +71,18 @@ typedef struct sql_context %type nulloperator %type identifier +// +// operator precedence +// + +// left associativity means that 1+2+3 translates to (1+2)+3 +// the order of operators here determines their precedence + +%left OR +%left AND +%right NOT +%left EQ LTEQ GTEQ LT GT LIKE IS + %% stmt: @@ -142,9 +154,9 @@ identifier: ; operator: - '=' { $$ = MDB_EQUAL; } - | '>' { $$ = MDB_GT; } - | '<' { $$ = MDB_LT; } + EQ { $$ = MDB_EQUAL; } + | GT { $$ = MDB_GT; } + | LT { $$ = MDB_LT; } | LTEQ { $$ = MDB_LTEQ; } | GTEQ { $$ = MDB_GTEQ; } | LIKE { $$ = MDB_LIKE; }