From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11139 invoked by alias); 10 Mar 2013 08:00:00 -0000 Received: (qmail 11129 invoked by uid 22791); 10 Mar 2013 07:59:59 -0000 X-SWARE-Spam-Status: No, hits=-3.2 required=5.0 tests=AWL,BAYES_00,RCVD_IN_HOSTKARMA_NO,RP_MATCHES_RCVD,TW_YY X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 10 Mar 2013 07:59:52 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id DBF002E7AE for ; Sun, 10 Mar 2013 03:59:51 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id gDdRx6tuI--Q for ; Sun, 10 Mar 2013 03:59:51 -0400 (EDT) Received: from kwai.gnat.com (kwai.gnat.com [205.232.38.4]) by rock.gnat.com (Postfix) with ESMTP id BE85C2E05D for ; Sun, 10 Mar 2013 03:59:51 -0400 (EDT) Received: by kwai.gnat.com (Postfix, from userid 1345) id B94553FF09; Sun, 10 Mar 2013 03:59:51 -0400 (EDT) From: Paul Hilfinger To: gdb-patches@sourceware.org Subject: [RFA/Ada] Allow 'thread' to be used as a variable name in expressions. Reply-to: Hilfinger@adacore.com Message-Id: <20130310075951.B94553FF09@kwai.gnat.com> Date: Sun, 10 Mar 2013 08:00:00 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-03/txt/msg00423.txt.bz2 GDB treats the identifiers 'if', 'thread', and 'task' unconditionally as expression delimiters in Ada mode, which is correct for 'if' and 'task', but wrong for 'thread' in cases such as print thread Borrowing from c-exp.y, we observe that 'thread' must be followed by numerals, whereas identifiers never are and treat them as delimiters only in that case. In the process, the current also refactors and incidentally fixes the code for rewinding the input to before the delimiting tokens. For example, the code watch expr if i > 2 fails because the input is only rewound to just before the 'i', leaving the 'if' as part of the expression (and thus making the rest look like trailing junk rather than a conditional clause). OK to commit? Paul N. Hilfinger (Hilfinger@adacore.com) gdb/ChangeLog: * ada-lex.l (rules): Only recognize 'thread' as a delimiter when followed by numerals, as for c-exp.y. Use new rewind_to_char function to rewind the input for expression-delimiting tokens. (rewind_to_char): New function. --- gdb/ada-lex.l | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index 2bad4a1..2b02985 100644 --- a/gdb/ada-lex.l +++ b/gdb/ada-lex.l @@ -53,6 +53,7 @@ static int processReal (const char *); static struct stoken processId (const char *, int); static int processAttribute (const char *); static int find_dot_all (const char *); +static void rewind_to_char(int); #undef YY_DECL #define YY_DECL static int yylex ( void ) @@ -157,18 +158,19 @@ static int find_dot_all (const char *); if { - while (*lexptr != 'i' && *lexptr != 'I') - lexptr -= 1; - yyrestart(NULL); + rewind_to_char ('i'); return 0; } -(task|thread) { +task { + rewind_to_char ('t'); + return 0; + } + +thread{WHITE}+{DIG} { /* This keyword signals the end of the expression and will be processed separately. */ - while (*lexptr != 't' && *lexptr != 'T') - lexptr--; - yyrestart(NULL); + rewind_to_char ('t'); return 0; } @@ -218,8 +220,7 @@ false { return FALSEKEYWORD; } "," { if (paren_depth == 0 && comma_terminates) { - lexptr -= 1; - yyrestart(NULL); + rewind_to_char (','); return 0; } else @@ -229,8 +230,7 @@ false { return FALSEKEYWORD; } "(" { paren_depth += 1; return '('; } ")" { if (paren_depth == 0) { - lexptr -= 1; - yyrestart(NULL); + rewind_to_char (')'); return 0; } else @@ -616,6 +616,23 @@ processAttribute (const char *str) return attributes[k].code; } +/* Back up lexptr by yyleng and then to the rightmost occurrence of character + CH, case-folded (there must be one). WARNING: since lexptr points to the + next input character that Flex has not yet transferred to its + internal buffer, the use of this function depends on the assumption + that Flex calls YY_INPUT only when it is logically necessary to do so + (thus, there is no reading ahead farther than needed to identify + the next token.) */ + +static void +rewind_to_char(int ch) +{ + lexptr -= yyleng; + while (toupper(*lexptr) != toupper(ch)) + lexptr -= 1; + yyrestart (NULL); +} + int yywrap(void) { -- 1.7.9.5