表示与文本网络协议相关的语法方式的常用方法是使用 ABNF。
就像任何与 EBNF 相关的元语法一样,ABNF 能够描述上下文无关的语法。
这些上下文无关的语法可以代表一种非常规语言,对吧?
实现网络堆栈的常用方法是开发状态机。是否有任何不是常规语言的文本网络协议?
表示与文本网络协议相关的语法方式的常用方法是使用 ABNF。
就像任何与 EBNF 相关的元语法一样,ABNF 能够描述上下文无关的语法。
这些上下文无关的语法可以代表一种非常规语言,对吧?
实现网络堆栈的常用方法是开发状态机。是否有任何不是常规语言的文本网络协议?
我想您指的是“传统的”基于行的文本协议。例如,任何使用 XML 的协议都不是常规的,因为 XML 不是常规语言(事实上,如果您查看单个字符的级别,XML 甚至不是上下文无关的)。在那种情况下,我真的想不出任何非常规协议。在语言语法中使用非常规的最常见方法是要求解析器能够计数,在我看来,需要这种能力来解析消息的协议会很复杂(例如,匹配括号)或限制(例如,通过明确计数而不是允许任意长的列表)。
使用 BNF 可能是因为它作为语法描述很容易理解,而不是因为上下文自由为您提供了任何必要的额外功能。我认为主要的好处是能够使用变量来代表常见的语法片段。如果您查看常见 Internet 协议规范中的 BNF,您会注意到它们实际上只使用了常规语言的特性:无限重复、选择、可选性。
您提到协议的状态机实现的陈述对我来说听起来像是一些误解。实现为状态机的不是解析器,而是协议引擎,状态转换不是由输入中的单个字符或令牌触发,而是由完整的消息触发。通常,协议状态机中的状态比实际通信更关心通信的建立和拆除。例如,TCP 状态机有 11 个状态,其中只有一个状态满足连接建立状态,这是所有实际数据传输发生的地方,其余的都是关于打开和关闭连接的状态。(是的,我知道 TCP 不是文本的,但它是具有已建立状态机的众所周知的协议,因此它是一个很好的例子;