首页 > 解决方案 > {:error, {:undefined, :standard_syntax_parser, ['之前的语法错误:', []]}}

问题描述

所以我正在尝试使用yecc。

Terminals string string_delimeter.

Nonterminals value string_content.

Rootsymbol value.

value -> string : extract_value('$1').

value -> string_delimeter string_content string_delimeter : '$2'.
string_content -> value string_content : ['$1' | '$2'].
string_content -> value : '$1'.

Erlang code.

extract_value({_, Value}) -> Value.

对于输入:

[string_delimeter: '\'', string: 'test', string_delimeter: '\'']

我明白了

{:error, {:undefined, :standard_syntax_parser, ['syntax error before: ', []]}}

如果我删除围绕 string_content 的任何(左或右)string_delmeter:

value -> string_delimeter string_content string_delimeter : '$2'.

value -> string_delimeter string_content : '$2'.

为了

[string_delimeter: '\'', string: 'test']

它返回

{:ok, 'test'}

我真的不明白这种行为,问题出在哪里?

标签: erlangyecc

解决方案


对于输入:

[string_delimeter: '\'', string: 'test', string_delimeter: '\'']

我认为你很困惑(或者可能是我!)。 yecc需要一个令牌列表,其中一个令牌是一个 2 或 3 个元素的元组。来自yecc 文档

用户应该实现一个扫描器来分割输入文本,并将其转换为一个或多个令牌列表。每个标记都应该是一个元组,包含有关语法类别、文本中的位置(例如行号)以及在文本中找到的实际终端符号的信息:{Category, LineNumber, Symbol}.

如果终端符号是类别的唯一成员,并且符号名称与类别名称相同,则标记格式可能是 {Symbol, LineNumber}...

这是 yecc 期望的示例:

[
     {'[',1},
     {atom,1,foo},
     {',',1},
     {'[',1},
     {int,1,1},
     {']',1},
     {',',1},
     {'[',1},
     {atom,1,bar},
     {',',1},
     {'[',1},
     {int,1,2},
     {',',1},
     {int,1,3}, 
     {']',1},
     {']',1},
     {']',1}
]

您可以使用 实现这样的扫描器leex,然后将输出提供给yecc解析器。

一个忠告:你永远不应该发布一个描述你如何运行你的代码的问题——这只是在浪费时间。而是复制并粘贴您运行的确切命令以及这些命令产生的输出。你要说的是:

  1. 这是我尝试过的:

[你的代码在这里]

  1. 这是输出:

[您运行的所有命令和此处的输出]

  1. 这是我期望/想要的输出,或者 Wtf??!! 正在进行。

[此处的预期/期望输出]


推荐阅读