首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >野牛修复解析深度

野牛修复解析深度
EN

Stack Overflow用户
提问于 2013-12-08 07:34:17
回答 1查看 117关注 0票数 0

当时我正在写LOLCODE解释器,结果遇到了一个问题。在LOLCODE函数调用中,如下所示:

代码语言:javascript
复制
<func_name> <arg1> <arg2> ....
myfunc 1 2 3 

让我们考虑一下,myfunc需要三个args。我不知道如何支持这样的建筑:

代码语言:javascript
复制
VISIBLE myfunc 1 2 3 4

我希望野牛能这样解析它:

代码语言:javascript
复制
myfunc 1 2 3 -> function
4 -> expr

我将函数调用声明为:

代码语言:javascript
复制
ID expr_list { $$ = new ExprFunctionCall($1, $2); } 

其中expr_list是:

代码语言:javascript
复制
expr_list
    : expr_list expr { $$->putExpr($2); }
    | /* epsilon */ { $$ = new ExprList(); }
    ;

如果我知道已声明的函数性,我如何告诉野牛该停在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-08 08:08:40

你不能在野牛里这么做。反正也不干净。Bison是一个解析上下文无关语言的工具,而您的工具依赖于上下文。

有时,您可以弯曲规则并在其中插入一些上下文依赖项,比如C和C++,但在您的示例中,可能值得研究其他解析器生成器。如果无论如何都要这样做,那么引入一个显式令牌来结束函数调用,并引入另一个助手符号来处理函数参数。这个特殊的令牌不是在源中找到的,它是由lexer根据解析器的请求注入的。

规则应该大致类似于这样(未经测试的语法很可能在第一次尝试时不起作用,但一般的想法是这样的):

代码语言:javascript
复制
call
    : function expr_list { ... }
    ;

function
    : ID { ... push function arity on some stack somewhere }

expr_list
    : expr_list pre_expr expr { ... }
    | pre_expr END_LIST { ... }
    ;

pre_expr
    : /* epsilon */ { ... decrease function arity on the top of the stack
                          if it's zero, 
                                  tell the lexer to issue END_LIST token next
                                  and pop the arity off the stack
                    }
    ;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20450982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档