2012-03-10 4 views
1

У меня есть следующая грамматика для проверки действительности файла XML, файл начинается с элемента, а затем с корневого узла.YACC-грамматика уменьшить/уменьшить конфликт

program 
    : terminal_node 
     root 
    ; 
root 
    : '<' ID attribute_list '>' node_list '<' ID '/''>' 
    ; 
node_list 
    : node 
    | node node_list 
    ; 
node 
    : terminal_node 
    : nonterminal_node 
    ; 

terminal_node 
    : '<' ID attribute_list '/''>' 
    ; 

nonterminal_node 
    : '<' ID attribute_list '>' node_list '<' ID '/''>' 
    ; 
attribute_list 
    : attribute 
    | attribute attribute_list 
    ; 

attribute 
    : ID ASSIGNOP '"' ID '"' 
    | ID ASSIGNOP '"' NUM '"' 
    ; 

Я получаю 1 конфликт уменьшения/уменьшения, и я не знаю, как его найти. Любая помощь будет оценена по достоинству.

+0

"корень" и "nonterminal_node" точно так же. – wildplasser

ответ

1

Это выглядит немного странно для грамматики XML. Вы уверены, что не хотите пустое node_list s или attribute_list s?

Во всяком случае, попробуйте следующее:

node_list 
    : node 
    | node_list node /* list first, element second, this is the LALR way */ 
    ; 
node 
    : terminal_node 
    | nonterminal_node /* note a typo in your code here */ 
    ; 
+0

это первая версия, чтобы убедиться, что она работает, да, я понял, что это должен быть узел node_list. – mihajlv