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

конец

Другие вопросы по тегам