[英]SimpleParse non-deterministic grammar until runtime
我正在使用Python開發基本的網絡協議,該協議應該能夠傳輸ASCII字符串(讀取:以EOL終止)和二進制數據。 為了使后者可行,我選擇創建語法,使其包含將要成為二進制字節的字節數。
到目前為止,對於SimpleParse來說,語法看起來像這樣[1]:
EOL := [\n]
IDENTIFIER := [a-zA-Z0-9_-]+
SIZE_INTEGER := [1-9]*[0-9]+
ASCII_VALUE := [^\n\0]+, EOL
BINARY_VALUE := .*+
value := (ASCII_VALUE/BINARY_VALUE)
eol_attribute := IDENTIFIER, ':', value
binary_attribute := IDENTIFIER, [\t], SIZE_INTEGER, ':', value
attributes := (eol_attribute/binary_attribute)+
command := IDENTIFIER, EOL
command := IDENTIFIER, '{', attributes, '}'
問題是我不知道如何指示SimpleParse,以下內容將在運行時變成SIZE_INTEGER字節的二進制數據。
原因是終端BINARY_VALUE的定義可以滿足我現在的需要,因此無法更改。
謝謝
編輯
我想該解決方案將告訴它在與生產binary_attribute匹配時停止運行,並讓我手動填充AST節點(通過socket.recv()),但是該怎么做呢?
編輯2
不能使用Base64編碼或類似方法。
[1]我尚未測試過,所以我不知道它是否切實可行,這只是給您一個主意
如果語法與您引用的語法一樣簡單,那么使用解析器生成器可能會過大? 您可能會發現,手動滾動自己的遞歸解析器更加簡單快捷。
如果您希望您的應用程序具有可移植性和可靠性,我建議您僅通過電線傳遞標准ASCII字符。
不同的計算機體系結構具有不同的二進制表示形式,不同的字長,不同的字符集。 有三種解決方法。
首先,您可以忽略這些問題,並希望您只需要在單個平台上實現該協議。
您可以通過兩種方法處理所有計算機科學,並為每種可能的數據類型ala CORBA提出一個“基本形式”。
通過網絡發送數據時,您可以實踐並使用“ sprintf”和“ scanf”的魔力在純ASCII字符之間來回轉換數據。
我還建議您的協議在消息開頭或開頭附近包含一條消息長度。 自制協議中最常見的錯誤是接收方希望接收的數據量超過發送的數據,並因此永遠等待從未發送的數據。
我強烈建議您考慮使用構造庫來解析二進制數據。 它還支持文本(ASCII),因此,當檢測到文本時,可以將其傳遞給基於SimpleParse的解析器,但是二進制數據將通過構造進行解析。 非常方便且強大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.