0

所以我有一个包含空字符串的语法。语法是这样的:

S->ε

S->表达式;; 小号

当我运行我的解析器时,我收到错误“没有更多的状态要丢弃”,所以我相信我没有正确表示空字符串。那么我将如何去表示它,特别是在 lexer .mll 文件中?

我知道我需要为它制定一个规则,所以我认为我已经把它记下来了。这就是我认为解析器 .mly 文件应该看起来的样子,不包括表达的东西。

s:
| EMPTY_STRING            { [] }
| expression SEMICOLON s  { $1::$3 }
4

1 回答 1

1

您将 epsilon 视为令牌,但它不是令牌。这是一个长度为 0 的标记序列。由于那里没有令牌,因此您的扫描仪不需要了解它。只是解析器需要知道它。

这是一个类似于我认为你想要的语法:

%token X
%token SEMICOLON
%token EOF
%start main
%type <char list> main
%%
main :
  s EOF           { $1 }

s :
  | epsilon         { $1 }
  | X SEMICOLON s { 'x' :: $3 }

epsilon :
                  { [] }

请注意,这epsilon是一个非终端(不是令牌)。它的定义是一个空的符号序列。

于 2016-02-23T07:02:53.340 回答