0

我正在努力理解 yacc 递归。所以我创建了一种最小的语言,我想简单地回显给它的数字列表。我正在使用 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
 ;

我需要什么操作来回显以空格分隔的数字列表?

4

1 回答 1

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); }
 ;

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

希望这会让事情变得清晰。(PS - 我没有运行和测试它,没有 JISON)

于 2015-02-14T19:33:22.700 回答