首页
学习
活动
专区
圈层
工具
发布

Jison递归
EN

Stack Overflow用户
提问于 2015-04-15 16:29:59
回答 2查看 388关注 0票数 2

我在试着了解一下吉森。不过,我有点麻烦。以下解析器总是返回[],不管您给它什么。

代码语言:javascript
复制
%lex
%%

"data"\s*             return 'DATA'
[A-Za-z][A-Za-z0-9_]* return 'IDENTIFIER'
[0-9]+("."[0-9]+)?\b  return 'NUMBER'
"="                   return 'ASSIGN'
("<-"|"<+-")          return 'REACT'
"+"                   return '+'
"-"                   return '-'
"*"                   return '*'
"/"                   return '/'
"^"                   return '^'
\n+                   return 'NL'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%token NL

/* operator associations and precedence */

%left ASSIGN
%left REACT
%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS

%start program

%% /* language grammar */

program
    :
        {return [];}
    | program statement
        {return $1.concat([$2]);}
    | program statement EOF
        {return $1.concat([$2]);}
    ;

statement
    : assign NL
        {return $1;}
    ;

assign
    : IDENTIFIER ASSIGN expression
        {return ['assign', $1, $3];}
    | IDENTIFIER REACT expression
        {return ['react', $1, $2, $3];}
    ;

expression
    : NUMBER
        {return +$1;}
    | IDENTIFIER
    ;

问题显然在我对非终端program的定义中。怎样才是正确的申报方式呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-15 20:02:24

正如Aadit M. Shah在评论中指出的那样,问题是在解析完成之前,不能在jison语法操作中使用return。如果解析器规则执行return,解析器本身将返回。您需要为$$分配语义值。

票数 3
EN

Stack Overflow用户

发布于 2016-01-20 20:18:03

尝试:

代码语言:javascript
复制
%start program

%% /* language grammar */

program
    : EOF
        { return []; }
    | statements EOF
        { return $1; }
    ;
statements
    : statement
        { $$ = [$1]; }
    | statements statement
        { $1.push($2); $$ = $1; }
    ;

另外,将返回替换为"$$ =“

代码语言:javascript
复制
statement
    : assign NL
        { $$ = $1; }
    ;

assign
    : IDENTIFIER ASSIGN expression
        { $$ = ['assign', $1, $3]; }
    | IDENTIFIER REACT expression
        { $$ = ['react', $1, $2, $3]; }
    ;

expression
    : NUMBER
        { $$ = $1; }
    | IDENTIFIER
        {/*add something here like $$ = $1 to keep the original value*/}
    ;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29655780

复制
相关文章

相似问题

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