为了处理在壳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_doc
在read_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
这是正常设计一个分析器,可以改变函数yylex()如何表现?
当然。它可能不是很理想,但它是非常常见的。
POSIX Shell的语法是远为Flex /野牛解析器的理想人选,并约你可以说使用Flex和野牛在bash执行的唯一的事情是,它证明了这些工具如何灵活可如果推到其各自的局限性。这里,文档是不是哪里“词汇反馈”是必要的唯一地方。
但是,即使在更严格的语言,词汇反馈也是有用的。或者其替代:写作部分的分析逻辑到词法,以便它知道何时解析将需要一套不同的词法规则。
可能是最知名的(或最频繁评论)词法反馈是C风格的转换表达式,这需要词法分析器知道foo
的(foo)
是否是一个类型名与否的解析。 (这通常是由解析器和词法分析器但是精确的实现细节是棘手之间共享的符号表的方式来实现)。
这里有一些其他例子,这可能会被视为词法反馈相对良性的用途,虽然他们肯定会增加词法和语法分析器之间的耦合。
/
s写入包围。但/
也可以是一个除法运算符或在/=
变异算第一个字符。词法决定依赖于上下文解析。 (这可以通过从近期令牌的历史,这将算作再现词法扫描器解析逻辑的一部分词法猜测。)<
。作为模板托架而不是比较运营商可能与扫描器来处理使用 - 在C ++中,例如,它取决于如前述标识符是否是一个模板或不特性 - 但实际上并不改变词汇方面。然而,使用角撑架的指示的X / HTML文本(或模板)绝对改变词汇上下文的开始。与上面的正则表达式例子,有必要知道的比较运营商是否会在语法上是有效还是无效。是不是因为shell语言不是LALR(1),所以没有办法避免的语法行动改变
yylex()
的行为?
POSIX Shell的语法肯定不是LALR(1),甚至是免费的上下文。但大多数语言不能scannerlessly与LALR(1)解析器解析,和许多语言转出,如果你把所有的语法因素考虑在内不具有上下文无关文法。 (参看C样式转换表达式,上面。)也许壳更远离柏拉图理想比大多数。但后来,它长大了从计划内核多年来为简单型,而不是形式上可分析。 (没有从我这个借口是否可以扩展到Perl中,我不打算在这里讨论评论。)
我想概括地说,就是它嵌入其他语言的语言(正则表达式,HTML片段时,Flex /野牛语义动作,外壳算术扩展,等等,等等)一个简单的解析器/扫描模式提出了挑战。尽管许多有趣的工作和扎实的实验,我的感觉是,语言嵌入仍然缺乏良好的可实现的形式结构。而且,由于大多数语言的确有嵌入式子语言,有和将继续在自己的解析器实现一定adhockery。在某种程度上,这是什么使得研究这么多的乐趣这一领域。