用于回显列表的Yacc递归方法?

时间:2014-07-14 06:28:52

标签: bison yacc jison

我正在努力理解yacc递归。所以我创建了一个最小的语言,我想简单地回显一个给它的数字列表。我使用的是JISON。这是JISON:

/* description: Parses end executes mathematical expressions. */

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  return 'NUMBER'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%start expressions

%% /* language grammar */

expressions
    : e EOF 
        {}
    ;

 e
    : NUMBER {}
    | NUMBER e
 ;

我需要采取哪些措施来回应由空格分隔的数字列表?

1 个答案:

答案 0 :(得分:0)

@JoachimPileborg说得对:

  

首先,您应该设置扫描的数字,以便解析器可以读取它。使用Lex / Yacc时,通常使用yylval来完成。然后只需将代码添加到解析器规则中即可打印该数字。

JISON使用yacc / bison的语法处理器,但必须在Javascript中指定操作。由于您想要一个动作示例,我假设您可以使用Javascript进行编程?

/* description: Parses end executes mathematical expressions. */

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  yylval = ParseInt(yytext); return 'NUMBER'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%start expressions

%% /* language grammar */

expressions
    : e EOF 
        {}
    ;

 e
    : NUMBER { print($1); }
    | NUMBER e { print($1); }
 ;

我所做的就是将数字的lexeme转换为整数并将其存储在词法部分的yylval中,并在每次使用NUMBER标记时在解析器部分中打印该值

希望,这将表明清楚。 (PS - 我没有运行和测试它,没有JISON)