【问题标题】:Jison: Distinguishing between digits and numbersJison:区分数字和数字
【发布时间】:2023-03-30 06:43:01
【问题描述】:

下面是我想与 Jison 一起使用的最小语法示例。

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  return 'NUMBER'
[0-9]                 return 'DIGIT'
[,-]                  return 'SEPARATOR'

// EOF means "end of file"
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%start expressions

%% /* language grammar */

expressions
    : e SEPARATOR d EOF
        {return $1;}
    ;

d
    : DIGIT
        {$$ = Number(yytext);}
    ;

e
    : NUMBER
        {$$ = Number(yytext);}
    ;

在这里,我定义了NUMBERDIGIT,以便根据上下文同时允许数字和数字。我不知道的是我如何定义上下文。上面的例子总是返回

Expecting 'DIGIT', got 'NUMBER'

当我尝试在Jison debugger 中运行它时。如何定义语法以始终期望分隔符后有一个数字?我尝试了以下也不起作用

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[,-]                  return 'SEPARATOR'

// EOF means "end of file"
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%start expressions

%% /* language grammar */

expressions
    : e SEPARATOR d EOF
        {return $1;}
    ;

d
    : [0-9]
        {$$ = Number(yytext);}
    ;

e
    : [0-9]+("."[0-9]+)?\b
        {$$ = Number(yytext);}
    ;

【问题讨论】:

    标签: parsing grammar bison jison


    【解决方案1】:

    经典的扫描器/解析器模型(最初来自 lex/yacc,也由 jison 实现)将扫描器放在解析器之前。换句话说,扫描器应该对输入流进行标记而不考虑解析上下文

    包括 jison 在内的大多数词法扫描器生成器都为扫描器提供了一种适应上下文的机制(请参阅“启动条件”),但扫描器自己负责跟踪上下文,这变得非常丑陋。

    在这种情况下,最简单的解决方案是仅定义一个NUMBER 标记,并让解析器检查实际上需要DIGIT 的规则的语义操作中的有效性。这将起作用,因为DIGITNUMBER 之间的差异不会影响解析,只会使某些解析非法。如果NUMBERDIGIT 之间的差异决定了使用哪个产生式,那将是不同的,但这可能会产生歧义,因为所有数字实际上也是数字。

    另一种解决方案是允许NUMBERDIGIT,其中允许数字。这将需要更改e 以便它接受NUMBERDIGIT,并确保DIGITNUMBERDIGIT 都可能的情况下胜出。这需要将其规则放在语法文件的前面,并在末尾添加\b

    [0-9]\b               return 'DIGIT'
    [0-9]+("."[0-9]+)?\b  return 'NUMBER'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 2021-11-05
      • 2013-07-17
      • 2018-10-07
      • 2016-09-21
      相关资源
      最近更新 更多