所以我有一个包含空字符串的语法。语法是这样的:
S->ε
S->表达;;小号
当我运行解析器时,我收到错误“没有更多状态丢弃”,所以我相信我没有正确表示空字符串。那么我将如何表示它,特别是在lexer .mll文件中呢?
我知道我需要为它制定一个规则所以我认为我已经失去了它。这就是我认为解析器.mly文件的样子,不包括表达式的东西。
s:
| EMPTY_STRING { [] }
| expression SEMICOLON s { $1::$3 }
答案 0 :(得分: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
是非终端(不是令牌)。它的定义是一个空符号序列。