Expand keyword lexing intelligence in the linespec parser.
authorKeith Seitz <keiths@redhat.com>
Mon, 23 Mar 2015 19:59:18 +0000 (12:59 -0700)
committerKeith Seitz <keiths@redhat.com>
Mon, 23 Mar 2015 20:16:39 +0000 (13:16 -0700)
commit0578b14e990e76f3c2dd9010c4cb9201bc9fa4b4
treef1d3015cb60449da8288124ca8634ac7aa13a584
parent7e993ebf2343a5b39d6d1df29fdebc2818064ae5
Expand keyword lexing intelligence in the linespec parser.

    This patch changes the heuristic the linespec lexer uses to
    detect a keyword in the input stream.

    Currently, the heuristic is: a word is a keyword if it
    1) points to a string that is a keyword
    2) is followed by a non-identifier character

    This is strictly more correct than using whitespace. For example,
    it allows constructs such as "break foo if(i == 1)". However,
    find_condition_and_thread in breakpoint.c does not support this expanded
    usage. It requires whitespace to follow the keyword.

    The proposed new heuristic is: a word is a keyword if it
    1) points to a string that is a keyword
    2) is followed by whitespace
    3) is not followed by another keyword string followed by whitespace

    This additional complexity allows constructs such as
    "break thread thread 3" and "break thread 3".  In the former case,
    the actual location is a symbol named "thread" to be set on thread #3.
    In the later case, the location is NULL, i.e., the default location,
    to be set on thread #3.

    In order to pass all the new tests added here, I've also had to add a
    new feature to parse_breakpoint_sals, which expands recognition of the
    default location to keywords other than "if", which is the only keyword
    currently permitted with the default (NULL) location, but there is no
    reason to exclude other keywords.

    Consequently, it will be possible to use "break thread 1" or
    "break task 1".

    In addition to all of this, it is now possible to remove the keyword_ok
    state from the linespec parser.

    gdb/ChangeLog

     * breakpoint.c (parse_breakpoint_sals): Use
     linespec_lexer_lex_keyword to ascertain if the user specified
     a NULL location.
     * linespec.c [IF_KEYWORD_INDEX]: Define.
     (linespec_lexer_lex_keyword): Export.
     (struct ls_parser) <keyword_ok>: Remove.
     A keyword is only a keyword if not followed by another keyword.
     (linespec_lexer_lex_one): Remove keyword_ok handling.
     Add comment explaining why the parsing stream is not advanced
     when a keyword is seen.
     (parse_linespec): Remove parser->keyword_ok.
     * linespec.h (linespec_lexer_lex_keyword): Add declaration.

    gdb/testsuite/ChangeLog

     * gdb.linespec/keywords.c: New file.
     * gdb.linespec/keywords.exp: New file.
gdb/breakpoint.c
gdb/linespec.c
gdb/linespec.h
gdb/testsuite/gdb.linespec/keywords.c [new file with mode: 0644]
gdb/testsuite/gdb.linespec/keywords.exp [new file with mode: 0644]