Is it always possible to make a non-reentrant parser reentrant?

Peng Yu <[email protected]>
Newsgroups gmane.comp.parsers.bison.general
Message-ID <CABrM6wmewC-69cQ3Yrg4Mb14n=DF_q01xPmk5O+TBotaW6tNLw@mail.gmail.com>
Hi,

The bash parser uses global variables and it also uses lexical freeback.

For example, to deal with heredoc in bash, the grammar rule will change the
variable `need_here_doc` via `push_heredoc()`.

```
    |   LESS_LESS WORD
            {
              source.dest = 0;
              redir.filename = $2;
              $$ = make_redirection (source, r_reading_until, redir, 0);
              push_heredoc ($$);
            }
```
http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n539

```
static void
push_heredoc (r)
     REDIRECT *r;
{
  if (need_here_doc >= HEREDOC_MAX)
    {
      last_command_exit_value = EX_BADUSAGE;
      need_here_doc = 0;
      report_syntax_error (_("maximum here-document count exceeded"));
      reset_parser ();
      exit_shell (last_command_exit_value);
    }
  redir_stack[need_here_doc++] = r;
}
```

http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n2794

`need_here_doc` is used in `read_token()`, which is called by
`yylex()`. This makes the behavior of `yylex()` non-automomous.

It seems to me that the parsing code could be made simpler by making
the parser reentrant. So there can be a parser parses anything not
heredoc and another parser just parse heredoc. And there should
different lexers for non-heredoc and heredoc. Is it so?

Does anybody have any suggestions on how to make the parsing code more
manageable?

````
      if (need_here_doc)
    gather_here_documents ();
````
http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n3285

````
  current_token = read_token (READ);
````

http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n2761

-- 
Regards,
Peng

_______________________________________________
[email protected] https://lists.gnu.org/mailman/listinfo/help-bison
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.