В настоящее время я пытаюсь написать грамматику Treetop для анализа файлов простого игрового формата, и пока она в основном работает. Однако есть несколько вопросов, которые возникли.
- Я не уверен, как на самом деле получить доступ к структуре, которую Treetop генерирует после разбора.
- Есть ли лучший способ обработки захвата всех символов, чем правило моего символа?
Есть случай для комментариев, которые я не могу написать правильно.
C [player1 [4k \]: привет player2 [3k \]: привет!]
Я не могу обернуть голову, как справиться с вложенной структурой узла C [] с [] внутри них.
Это мой текущий прогресс.
SGF-grammar.treetop
grammar SgfGrammar
rule node
'(' chunk* ')' {
def value
text_value
end
}
end
rule chunk
';' property_set* {
def value
text_value
end
}
end
rule property_set
property ('[' property_data ']')* / property '[' property_data ']' {
def value
text_value
end
}
end
rule property_data
chars '[' (!'\]' . )* '\]' chars / chars / empty {
def value
text_value
end
}
end
rule property
[A-Z]+ / [A-Z] {
def value
text_value
end
}
end
rule chars
[a-zA-Z0-9_/\-:;|'"\\<>(){}!@#$%^&\*\+\-,\.\?!= \r\n\t]*
end
rule empty
''
end
end
И мой тестовый пример, в настоящее время исключающий узлы C [] с вышеупомянутой проблемой вложенных скобок:
example.rb
require 'rubygems'
require 'treetop'
require 'sgf-grammar'
parser = SgfGrammarParser.new
parser.parse("(;GM[1]FF[4]CA[UTF-8]AP[CGoban:3]ST[2]
RU[Japanese]SZ[19]KM[0.50]TM[1800]OT[5x30 byo-yomi]
PW[stoic]PB[bojo]WR[3k]BR[4k]DT[2008-11-30]RE[B+2.50])")