带有空字符串的 ocamlyacc
ocamlyacc with empty string
所以我有一个包含空字符串的语法。语法是这样的:
S->ε
S->表达式;; S
当我 运行 我的解析器时,我收到错误 "No more states to discard",所以我相信我没有正确表示空字符串。那么我将如何表示它,特别是在词法分析器 .mll 文件中?
我知道我需要为此制定规则,所以我想我已经记下了。这是我认为解析器 .mly 文件应该看起来的样子,不包括表达式的内容。
s:
| EMPTY_STRING { [] }
| expression SEMICOLON s { :: }
您将 epsilon 视为令牌,但它不是令牌。它是一个 0 长度的标记序列。由于那里没有令牌,因此您的扫描仪不需要知道它。只是解析器需要知道它。
这是我认为您想要的语法:
%token X
%token SEMICOLON
%token EOF
%start main
%type <char list> main
%%
main :
s EOF { }
s :
| epsilon { }
| X SEMICOLON s { 'x' :: }
epsilon :
{ [] }
请注意 epsilon
是一个非终结符(不是标记)。它的定义是一个空的符号序列。
所以我有一个包含空字符串的语法。语法是这样的:
S->ε
S->表达式;; S
当我 运行 我的解析器时,我收到错误 "No more states to discard",所以我相信我没有正确表示空字符串。那么我将如何表示它,特别是在词法分析器 .mll 文件中?
我知道我需要为此制定规则,所以我想我已经记下了。这是我认为解析器 .mly 文件应该看起来的样子,不包括表达式的内容。
s:
| EMPTY_STRING { [] }
| expression SEMICOLON s { :: }
您将 epsilon 视为令牌,但它不是令牌。它是一个 0 长度的标记序列。由于那里没有令牌,因此您的扫描仪不需要知道它。只是解析器需要知道它。
这是我认为您想要的语法:
%token X
%token SEMICOLON
%token EOF
%start main
%type <char list> main
%%
main :
s EOF { }
s :
| epsilon { }
| X SEMICOLON s { 'x' :: }
epsilon :
{ [] }
请注意 epsilon
是一个非终结符(不是标记)。它的定义是一个空的符号序列。