2014-04-05 78 views
2

Helllo, 我的語法如下:通過讀取tutorial左保用秒差距

<attribute_value> ::= <spec_constant> | <symbol> | (<s_expr>*) 
<attribute>  ::= <keyword> | <keyword> <attribute_value> 

,它說,它可能使用buildExpressionParser,它會執行左保理,但沒有一個例子。

有人可以給我一個例子,我應該如何使用Parsec解析上述語法,或只是指出我在正確的方向?

謝謝你給予的任何幫助。

+4

你所顯示的語法有點不是左遞歸,所以它不需要左分解。 – pat

+0

我對解析器瞭解不多,但是沒有使用因式分解來解決第一個/第一個衝突?我的問題在''分析器如何知道在''和'之間採取哪條路徑? – Rogerp062

+1

當規則中的第一個匹配是規則本身時,需要左分解,這會在遞歸下降解析器中導致無限循環。在這裏,如果沒有找到,或者使<爲可選項,並且刪除'',則只需使用'try'來允許解析器在''只有分支。 – pat

回答

1

假設你已經有

data Keyword 
data AttributeValue 

data Attribute = KeywordOnly Keyword 
       | KeywordWithAttribute Keyword AttributeValue 

keyword :: Parser Keyword 
attributeValue :: Parser AttributeValue 

,那麼你可以先解析Keyword,然後任選解析attribute,然後將它們合併執行attribute :: Parser Attribute

attribute :: Parser Attribute 
attribute = pack <$> keyword <*> optionMaybe attributeValue 
    where 
    pack :: Keyword -> Maybe AttributeValue -> Attribute 
    pack kw = maybe (KeywordOnly kw) (KeywordWithAttribute kw) 

,而無需改變結構你的語法。