簡體   English   中英

如何實現表達式的優先級 Bakus-Naur 形式

[英]How to implement the priority of expressions Bakus-Naur Form

文檔中描述了這種語法:

grammar
    =
    | ['()'] ['$'] {'#' &'#'} '#'
    | ['()'] {'#' &'#'} '#%'
    | ['()'] ['$'] {'0' &'0'} '0'
    | ['()'] {'0' &'0%'} '0%'
    | ['()'] ['$'] {'#' &'0'} {'0' &'0'} '0'
    ;

如何正確描述語法,以便在嘗試解析字符串時得到以下結果:

對於字符串'######' ,我們得到結果(['#', '#', '#', '#', '#'], '#')為真(第一個規則有效)

對於字符串'#####%'我們得到結果(['#', '#', '#', '#'], '#')它應該是 False 它應該是(['#', '#', '#', '#'], '#%') (首先工作,但應該是第二條規則)

對於字符串'000000' ,我們得到結果(['0', '0', '0', '0', '0'], '0')它是 True (使用第三條規則)

對於字符串'###000'我們得到結果(['#', '#'], '#')它是 False (首先工作但應該是第五條規則)

文檔中給出的規則是荒謬的還是我做錯了什么?

Tatsu 按照聲明的順序嘗試規則。

所以在你的例子中:

| ['()'] ['$'] {'#' &'#'} '#'
| ['()'] {'#' &'#'} '#%'

第一條規則將在讀取%之前成功匹配#####

顛倒這兩個選項將使 Tatsu 嘗試首先解析#% ,並且只有在解析失敗時才嘗試#

注意:一旦成功解析了模式, ~符號也可用於避免嘗試其他規則選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM