erlang - {: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'}
我真的不明白这种行为,问题出在哪里?
解决方案
对于输入:
[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
解析器。
一个忠告:你永远不应该发布一个描述你如何运行你的代码的问题——这只是在浪费时间。而是复制并粘贴您运行的确切命令以及这些命令产生的输出。你要说的是:
- 这是我尝试过的:
[你的代码在这里]
- 这是输出:
[您运行的所有命令和此处的输出]
- 这是我期望/想要的输出,或者 Wtf??!! 正在进行。
[此处的预期/期望输出]
推荐阅读
- python - Lilliefors 测试在 python statsmodels 中不起作用
- reactjs - React Router Private Route 异步使用效果
- email - Kentico 忘记密码链接过期问题
- javascript - 从网站表中提取特定列的内容
- mongodb - 为 mongodb 恢复数据
- c++ - 在 C++ 中使用字符串数组拆分声明和赋值
- java - 可选与三元运算符
- java - 在 2 个类之间传输数据,而不知道您要传输的数据量及其类型
- php - 如何使用 API - PHP 在 XERO 中将状态更新为已支付并更新已支付金额和到期金额
- php - 无法使用 codeigniter 连接到 SQL SERVER 数据库