Как написать пользовательские функции и переменные в Jison? - PullRequest
0 голосов
/ 07 октября 2019

мой лекс-код

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

/* lexical grammar */
%lex
%%

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

/lex

/* operator associations and precedence */

%start expressions

%% /* language grammar */

expressions
    : e EOF
        {return $1;}
    ;

e
    | FUNCTION '('e')'
      {$$=$3}
    | NUMBER
        {$$ = Number(yytext);}
    ;

я получил ошибку

Parse error on line 1:
balaji()
-^
Expecting '(', got 'FUNCTION'

что я хочу передать myfun (a, b, ...), а также myfun (a) вЭтот парсер. Спасибо за ваше драгоценное время, потраченное на меня.

1 Ответ

1 голос
/ 07 октября 2019

[a-zA-Z] соответствует одному буквенному символу (в данном случае букве b), возвращающему FUNCTION. Когда требуется следующий токен, он снова соответствует одному буквенному символу (a), возвращая другой токен FUNCTION. Но, конечно, грамматика не допускает двух последовательных FUNCTION с;он ожидает (, как говорится.

Вы, вероятно, намеревались [a-zA-Z]+, хотя лучший шаблон идентификатора - [A-Za-z_][A-Za-z0-9_]*, который соответствует таким вещам, как my_function_2.

...