Treetop, похоже, не справляется с простой грамматикой (5 правил)

Я пытаюсь написать парсер для подмножества C.

Поведение вершины дерева трудно анализировать с помощью этой простой (еще более упрощенной) грамматики.

 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(){}"

И сообщение об ошибке от верхушки дерева:

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 

Таким образом, проблема связана с правилом идентификатора...

Версия верхушки дерева: 1.5.3 и Ruby 2.1.1.

Любая идея ?


person JCLL    schedule 10.07.2014    source источник
comment
У меня это работает (tt 1.4.10, ruby ​​2.0.0p353). Может быть, у вас есть оставшийся файл .rb, скомпилированный с помощью tt, который не позволяет вам загрузить обновленный файл .treetop? Это укусило меня раньше.   -  person wdebeaum    schedule 10.07.2014
comment
У меня тоже работает, возможно, проблема в том, как настроены ваши файлы.   -  person Josh Voigts    schedule 11.07.2014


Ответы (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

конец

person JCLL    schedule 12.07.2014