【问题标题】:Backus-Naur form of a token that begins and ends with double quotes以双引号开头和结尾的标记的 Backus-Naur 形式
【发布时间】:2013-11-18 19:46:11
【问题描述】:

是否可以编写一个令牌的 Backus-Naur 形式描述:

  • 以双引号开头
  • 以双引号结尾
  • 可以包含内部 双引号

?

例如,我有一个名为 MESSAGE 的编程结构,它看起来像:

MESSAGE “她对他说“你好””

这可以用 LL(1) Backus-Naur 形式来描述吗?

编辑:假设我通过简单地迭代每个字符进行解析,一次一个,使用一个前瞻指针。

输入字符串就是整个内容,包括 MESSAGE。

【问题讨论】:

  • 我认为您没有提供足够的信息来说明您正在尝试做什么以获得明确的答案。 MESSAGE 是输入的一部分吗? MESSAGE 可以跨越多行吗?你在解析什么,如何解析?
  • 你怎么知道 MESSAGE 结束的地方? iow,为什么。你的例子不是两个 MESSAGE 之间有一个单词 Hello 吗?
  • MESSAGE 是输入的一部分,但我已经知道如何在 BNF 中指定该部分。让我们假设它可以跨越多行(我正在研究以确定这是否正确,因为如果它不能,那么我可以解析到换行符)。我会更新问题,让它更清楚。

标签: parsing bnf


【解决方案1】:

这样的事情可能会奏效(对不起语法。不久前,我曾与 BNF 合作过)。

message : MESSAGE message_text
message_text : " inner_message " | message_text inner_message " inner_message "
inner_message : [a-z0-9...]+

你的例子MESSAGE "She said "Hello" to him" 应该分两步解释:首先,message_text 的第二种形式得到hello " to him",其次,message_text 的第一种形式得到"She said "

inner_message 必须包含所有可能的字符和空格。

正如 cmets 中提到的,“魔力”在于message_text 的第二个定义。由于 BNF 没有循环或 if 的概念,因此递归是描述重复的唯一方法。只需要确保语法不会模棱两可,这意味着对于每个可能的输入,只存在一个有效路径(或不存在,这会声明错误)。除了像" he replied with "" silence" 这样的空中间字符串之外,上述语法应该可以工作。

【讨论】:

  • 有趣。消息文本的第二个选项对我来说很难解释。这就是魔法所在吗?你介意用对话的方式解释吗?
  • 我尝试了答案。让我们看看我是否可以回答任何其他具体问题。
  • 啊,我明白了。我现在可以通过假设第一个选项是递归的基本情况来理解它。那么你怎么看:message_text : "inner_message" | " [message_text]+ " 那行得通,对吧?
  • 如果 BNF 允许像正则表达式这样的 lops。 BNF 在这一点上非常基础
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多