如何识别jison中令牌的重复?

时间:2017-12-27 15:44:32

标签: javascript parsing yacc jison

TL; TR

本练习的目的是检测某个令牌的重复,我试图用来自Regex的符号*来做,但它不起作用。

问题描述

我正在做一个基本的转换器,它包括用已经定义的语法翻译某些语法。在定义多个令牌的检测时,我仍然有一些缺点。也就是说,使用*来指定正则表达式令牌的重复(我认为*用于定义令牌的重复),例如(参见SENTENCE*) :

 FUNCTION
   : DEF ID PAR_OPEN PAR_CLOSE
       SENTENCE*
     END
        { $$ = 'function ' + $2 + '(){' + $5 + '}' };

  SENTENCE
    : PRINT
    | VAR_ASSIGN
    |;

语法适用于输入:

def hello() println "dsasd" end

但它不适用于条目:

def hello() a = 3 println "dsasd" end

抛出的错误是:

bash Error: Parse error on line 3: ...llo() a = 3 println "dsasd"end ---------------------^ Expecting 'EOF', '+', 'OR', 'AND', '=', '<>', '-', '*', '/', '>', '<', '>=', '<=','^', 'PAR_CLOSE', '%', 'END', got 'PRINTLN'

你能告诉我我做错了吗?

See Gist complete code

1 个答案:

答案 0 :(得分:0)

通过在语法中添加%ebnf来解决问题。见here