是否有可能由解析器壳解析定界符去除词法分析器的内部控制?

问题描述 投票:0回答:1

为了处理在壳heredoc(例如,bash)的,语法规则将改变经由need_here_doc可变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_docread_token(),这是由称为yylex()使用。这使得yylex()非automomous的行为。

这是正常设计一个分析器,可以改变yylex()如何表现?

是不是因为shell语言不是LALR(1),所以没有办法避免的语法行动改变函数yylex()的行为?

      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

parsing compiler-construction bison interpreter flex-lexer
1个回答
0
投票

这是正常设计一个分析器,可以改变函数yylex()如何表现?

当然。它可能不是很理想,但它是非常常见的。

POSIX Shell的语法是远为Flex /野牛解析器的理想人选,并约你可以说使用Flex和野牛在bash执行的唯一的事情是,它证明了这些工具如何灵活可如果推到其各自的局限性。这里,文档是不是哪里“词汇反馈”是必要的唯一地方。

但是,即使在更严格的语言,词汇反馈也是有用的。或者其替代:写作部分的分析逻辑到词法,以便它知道何时解析将需要一套不同的词法规则。

可能是最知名的(或最频繁评论)词法反馈是C风格的转换表达式,这需要词法分析器知道foo(foo)是否是一个类型名与否的解析。 (这通常是由解析器和词法分析器但是精确的实现细节是棘手之间共享的符号表的方式来实现)。

这里有一些其他例子,这可能会被视为词法反馈相对良性的用途,虽然他们肯定会增加词法和语法分析器之间的耦合。

  • Python的(和Haskell)要求词法重新制定前导空格为缩进或DEDENT语言标记。但是,如果在括号内出现换行符,空格处理被抑制(包括换行令牌本身)。
  • 的ECMAScript(JavaScript)的和其他语言允许正则表达式文字由/s写入包围。但/也可以是一个除法运算符或在/=变异算第一个字符。词法决定依赖于上下文解析。 (这可以通过从近期令牌的历史,这将算作再现词法扫描器解析逻辑的一部分词法猜测。)
  • 以上,许多语言相似,其中逻辑在词法复杂的方式过载<。作为模板托架而不是比较运营商可能与扫描器来处理使用 - 在C ++中,例如,它取决于如前述标识符是否是一个模板或不特性 - 但实际上并不改变词汇方面。然而,使用角撑架的指示的X / HTML文本(或模板)绝对改变词汇上下文的开始。与上面的正则表达式例子,有必要知道的比较运营商是否会在语法上是有效还是无效。

是不是因为shell语言不是LALR(1),所以没有办法避免的语法行动改变yylex()的行为?

POSIX Shell的语法肯定不是LALR(1),甚至是免费的上下文。但大多数语言不能scannerlessly与LALR(1)解析器解析,和许多语言转出,如果你把所有的语法因素考虑在内不具有上下文无关文法。 (参看C样式转换表达式,上面。)也许壳更远离柏拉图理想比大多数。但后来,它长大了从计划内核多年来为简单型,而不是形式上可分析。 (没有从我这个借口是否可以扩展到Perl中,我不打算在这里讨论评论。)

我想概括地说,就是它嵌入其他语言的语言(正则表达式,HTML片段时,Flex /野牛语义动作,外壳算术扩展,等等,等等)一个简单的解析器/扫描模式提出了挑战。尽管许多有趣的工作和扎实的实验,我的感觉是,语言嵌入仍然缺乏良好的可实现的形式结构。而且,由于大多数语言的确有嵌入式子语言,有和将继续在自己的解析器实现一定adhockery。在某种程度上,这是什么使得研究这么多的乐趣这一领域。

© www.soinside.com 2019 - 2024. All rights reserved.