Treetop, кажется, терпит неудачу на простой грамматике (5 правил)
Я пытаюсь написать парсер для подмножества C.
Поведение treetop трудно проанализировать на этой простой (далее упрощенной) грамматике.
grammar Shyc
rule functionDef
type space identifier '(' ')' bloc
end
rule type
'int'
end
rule bloc
'{' '}'
end
rule identifier
[a-zA-Z] [a-zA-Z_]*
end
rule space
[\s]+
end
end
Мой тестовый пример "int main(){}"
И сообщение об ошибке из Treetop:
error at line 1, column 9
failure reason : Expected [a-zA-Z_] at line 1, column 9 (byte 9) after
compiler.rb:25:in `parse': Parse error (RuntimeError)
from compiler.rb:73:in `<main>'enter
Таким образом, проблема вокруг правила идентификатора...
Версия treetop: 1.5.3 и Ruby 2.1.1
Любая идея?
1 ответ
Решение
Проблема заключалась в том, что мой контрольный пример находился в отдельном файле, с дополнительным концом строки \ n в конце, и что проверенная здесь грамматика не указывает, как его использовать.
Вот код, который решает проблему. Как обсуждалось здесь в списке рассылки Treetop, ошибка странная и каким-то образом вводящая в заблуждение, но в целом сложно автоматизировать передачу четкого сообщения.
grammar Shyc
rule functionDef
type space identifier '(' ')' bloc space?
end
rule type
'int'
end
rule bloc
'{' '}'
end
rule identifier
[a-zA-Z] [a-zA-Z_]*
end
rule space
[\s\n]+
end
конец