问题标签 [abnf]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
http - HTTP 1.1 标头值的格式是什么?
我阅读了 rfc7230 第 3.2 节。删除过时的规则后,关于 header 字段的规范是:
我对 的定义感到困惑field-content
。它似乎匹配 1 或 2 VCHAR
s,其间有任意数量的空格,但匹配后不会匹配另一个空格field-content
。
例如 for name:a<sp>b<sp>c
,field-name
会匹配name
, 但是field-content
会匹配a<sp>b
然后 next<sp>
不能被 another 匹配field-content
, 因此这个 header 是无效的。
但是,name:a<sp>bc<sp>d
是有效的,因为field-content
,a<sp>b
和有两个匹配项c<sp>d
。
我认为这是不一致的。这是故意的还是我误解了什么?
macros - 扩展 SPF 宏
我正在尝试基于 SPF RFC7208 实现 check_host 函数。它几乎准备好了,剩下的就是第 7 节(https://www.rfc-editor.org/rfc/rfc7208#section-7)中详述的宏扩展。我知道有现成的解决方案,但为了示例或实践,我想实现自己的算法。这样做时,我遇到了www.example.com不符合 ABNF 描述的问题。我认为这是因为我的推理错误,这就是我寻求帮助的原因。
这是从文档中复制的 ABNF:
我认为将 domain-spec 应用于www.example.com将遵循以下路径: domain-spec -> macro-string -> macro-literal (repeated) 这将耗尽整个字符串,然后 domain-end 将永远不会匹配.
我哪里错了?
编辑1:
我想我得到了答案,原来的问题更像是一个确认请求。ABNF 中的重复是贪婪的,但可能允许后退 - 即如果这会导致匹配,请少吃。查看 RFC5234 ( https://www.rfc-editor.org/rfc/rfc5234 ),虽然不是全部,但我无法确定地发现这一点。任何人都可以确认吗?
data-structures - 是否有一种类似于 BNF 的元语言可以简洁地描述自描述数据?
比如说我有一个自我描述的数据集。前几个结构良好的记录定义了数据类型 ID,其中包括记录的名称和长度,然后是内容记录,内容记录以数据 ID 开头并包含可变数量的数据,具体取决于 ID。
使用 BNF、EBNF 或 ABNF 来描述定义记录很容易......但是如何简洁地描述内容记录,其长度在定义记录中定义?
这是一个使用类似 BNF 的表示法描述经典 NetCDF 数据格式的示例,但并不简洁,因为在前面的定义中没有将 的长度指定为data
recs
数据的函数。dim
var
grammar - ABNF 规则 `zero = ["0"] "0"` 匹配 `00` 但不匹配 `0`
我有以下 ABNF 语法:
我希望这与字符串匹配0
,00
但它似乎只匹配00
?为什么?
repl-it 演示:https ://repl.it/@DanStevens/abnf-rule-zero-0-0-matches-00-but-not-0
http - 应该如何解析 HTTP 标头字段?
我正在尝试根据RFC 7230 的相关部分中header-field
指定的 ABNF 规则解析 HTTP 标头字段。这些规则是:
(obs-text
只是高位字节 0x80 到 0xff)。
我面临的问题是,header-field
当应用 chrome 在响应模式下设置的用户代理字符串时,规则似乎失败了:
问题源于唯一的“5”:当解析器到达“Nexus”中的最后一个“s”时,它会同时占用“s”、以下空格和“5”。这会将解析光标直接留在后面的空格处。那是
由于feild-content
不提供前导空格,因此该规则无法匹配整个标头字段,从而导致解析器无法解析消息的其余部分。
对我来说很明显,HTTP 标头应该能够包含被空格包围的单个字符。但是,根据我对规范的阅读,这似乎是不允许的。
我在网上搜索过,但没有找到任何相关的东西。所以我假设这是我的错误。我的错误在哪里?该规则实际上应该如何解释?
bnf - RFC 822 的 BNF 规则中的 & 符号是什么意思?
IETF RFC 822具有以下 BNF 规则:
我想知道与符号&
在这些规则中的含义。& 符号不是由 RFC 822 自己的 Notational Conventions 部分(第 2 节)定义的。我假设 RFC 822 将 RFC 733 用于其 BNF/ABNF,但 RFC 733 也没有定义 & 符号的含义。
根据上下文,我确定 &号并不意味着以下任何一种:
- 列表项分隔符(这就是逗号的用途,并且 & 号不代表牛津逗号样式表达式中的最后一个连词,因为我们在规则中看到了
&
先于最后一个)。,
text
- 如果它是一个列表项分隔符,在 的情况下应该如何解释
dtext
?
- 如果它是一个列表项分隔符,在 的情况下应该如何解释
- 连接(因为连接是通过两个相邻的生产规则来描述的,它们之间没有运算符)。
- 另外因为已经是 CR 和 LF 的串联,但 RFC 822在规则中
CRLF
区分了CRLF
和。bare CR & bare LF
text
- 另外因为已经是 CR 和 LF 的串联,但 RFC 822在规则中
在 RFC 822 的勘误表中没有提到这一点 - 并且 RFC 的后续 RFC (如 2822)用全新的规则替换了与符号的规则,所以我也无法从新语法中推断出它的含义。
那么是什么&
意思呢?
http - 由 HTTP 增强的 ABNF:#symbol 的规范性参考
语境
解决一个CORS
问题,我想知道 HTTP 响应标头的有效值是什么Access-Control-Allow-Headers
。
Whatwg CORS 标头语法规范在 ABNF 中告诉我:
Access-Control-Allow-Headers = #field-name
RFC7230告诉我:
此外,Whatwg 指出:
ABNF 表示 ABNF 由 HTTP(特别是添加 #)和 RFC 7405 增强。[RFC7405]
好的,我现在知道这个响应头是无效的:
Access-Control-Allow-Headers: Origin, Content-Type, content type, Accept, Authorization
字段名不应包含空格,但这会导致我的问题:
问题
#symbol
whatwg ABNF的规范参考在哪里?这不是定义 ABNF 语法的RFC5234 。我把它当作逗号分隔的字段,但我没有找到真正的参考。
PS:问题不是“什么是有效值Access-Control-Allow-Headers
”
sip - 以下 sintax rfc 3261 是否兼容?
您能否告诉我以下语法是否与 rfc3261 兼容?谢谢。
401 未经授权:
或者应该是
我正在尝试使用“https://github.com/nygge/abnfc/blob/master/samples/sip/rfc3261.abnf”进行分析,但没有成功。
拜托,你能帮我理解这个吗?对不起我的英语不好。谢谢。
bnf - Purescript 是否有可用的 BNF 类型语法?
有语言的BNF
类型语法描述Purescript
吗?
当语法被埋藏并分散在各种概念和意图等文档中时,很难很好地处理语言。
parsing - 如何根据一组 ABNF 语法规则对输入进行标记
我已阅读有关ABNF 规范的 RFC,并且很难理解如何使用一组 ABNF 规则从与语法匹配的某些输入字符串中可靠地提取标记。似乎该规范从未提及令牌或 AST,因此它可能不关心这一点,但我相信这将是应用任何 BNF 语法的最终目标,除非我弄错了。
在规范中,他们列出了解析邮政地址的示例规则:
还有一个核心规则列表,我不会在此处发布描述预期的常用规则。
最终,我想做的是找出接受输入所需的规则
并生成我认为正确的令牌序列,即:
[ "John"
, " "
, "H"
, "."
, "Doe"
, "\r\n"
,
"12345"
, " "
, "Fakestreet"
, "\r\n"
,
"Springfield"
, ","
, " "
, "IL"
, " "
, "55555"
, "\r\n"
]
(我认为空格和 CRLF 需要作为“令牌”返回,因为它们在某些规则中被指定为要求)
我正在考虑的一些问题:
- “Fakestreet”应该是它自己的标记是有道理的,但根据定义,它是可见字符核心规则的可变重复。理想情况下,我不想将每个字母作为其自己的标记(“F”、“a”、“k”等)读出,因此(假设核心规则可以被视为终端?)任何潜在的标记字符串都会需要对照整个理论上无限的规则定义
1*VCHAR
来检查它是否匹配。有些规则比这更复杂,比如 zip-code's5DIGIT ["-" 4DIGIT]
,但是任何潜在的标记也需要根据这个规则进行检查(“12345”和“12345-6789”都是有效的标记)。所以似乎整个规则元素连接也需要完全检查,除非“12345-6789”"12345"
"-"
,"6789"
] 哪个...可能是正确的? - 我假设我们不想完全检查引用其他规则的规则,否则我们最终可能会将整个邮政地址标记为“邮政地址”类型的单个标记。也许不应该检查引用其他规则的规则?也许有诸如“终端规则”之类的东西,它不包括规则参考(不包括核心规则)?
- 偶尔在规则中,终端值与规则引用结合,例如在“personal-part”的定义中,即文字“.”。被定义为。因此,虽然我们可能不想将任何潜在的标记字符串与整个“个人部分”规则定义进行匹配,但似乎我们确实想尝试将其与文字“.”进行匹配。因为它是解析个人部分所需的令牌。也许在非终端规则中,应该考虑列出的终端值?
我意识到这是一个冗长的问题,但似乎 EBNF 和 ABNF 之类的 BNF 超集正在用于此类事情,但我找不到如何从 ABNF 语法进行标记的标准规范。