![]() |
1
3
我想你指的是“传统的”基于行的文本协议。例如,任何使用xml的协议都不是正则的,因为xml不是正则语言(事实上,如果从单个字符的级别来看,xml甚至不是上下文无关的)。在这种情况下,我真的想不出任何非常规的协议。在语言语法中,最常见的非常规方法是要求解析器能够计数,而在我看来,一个需要这种能力来解析消息的协议将是复杂的(例如,匹配括号)或有限的(例如,通过显式计数而不是允许任意长的列表)。 使用bnf可能是因为它作为语法描述很容易理解,而不是因为上下文自由给了您任何必要的额外能力。我认为,它的主要优点在于能够使用变量来表示常见的语法片段。如果您看看常见的Internet协议规范中的BNF,您会注意到它们实际上只使用常规语言的特性:无限重复、选择、可选性。 在我看来,你提到协议的状态机实现听起来有些误解。它不是作为状态机实现的解析器,而是协议引擎,状态转换不是由输入中的单个字符或令牌触发的,而是由完整的消息触发的。通常,协议状态机中的状态与实际通信相比,更关心通信的建立和中断。例如,tcp状态机有11个状态,其中只有一个状态足以满足连接建立状态,这是所有实际数据传输发生的地方,其余的都是关于打开和关闭连接的。(是的,我知道TCP不是文本的,但是它是一个众所周知的协议,有一个已经建立的状态机,所以它是一个很好的例子;在协议引擎的层次上,消息语法是文本还是二进制并不重要。) |
|
goofy126 · 计算理论-DFA[闭合] 7 年前 |
![]() |
Marcos · 是否有一个术语来描述只应使用最后一个值的表格? 7 年前 |
|
ZhaiNan · 这能在O(N log(N))时间内解决3SUM吗? 7 年前 |
![]() |
Kishore · 如何证明(g(n))=O(g(n))(g(n)) 7 年前 |
![]() |
NaSh · 求图中局部最小值/最大值的爬山算法的时间复杂度 9 年前 |
![]() |
magic-sudo · 排序arrya的最有效方法[已关闭] 10 年前 |
![]() |
Dan Drews · 为什么替身能像他们那样工作 11 年前 |