Проблема с древовидной грамматикой, не соответствующей всем параметрам - PullRequest
1 голос
/ 17 сентября 2010

Я пишу небольшой, действительно простой парсер паролей в ruby ​​с самоцветом treetop, чтобы просто поэкспериментировать с ним. Тем не менее, это не совсем так, как я хочу, и документация довольно скудная, поэтому трудно понять, что я делаю неправильно. В настоящее время грамматика может соответствовать как символу, так и логическому значению, но не числу. Однако, когда я переключаю порядок в правиле атома, например на bool / number / symbol, он все равно совпадает с первыми двумя, но не с последним. Есть ли в древовидной структуре ограничение, которое означает, что в правиле может быть только два варианта? Кроме того, что-то вроде '(3)' все еще не анализируется.

Моя грамматика выглядит следующим образом:

grammar Lisp
 rule expression
   atom / list
 end

 rule atom
   symbol / bool / number
 end

 rule number
   [0-9]*
 end

 rule bool
   'T' / 'F'
 end

 rule symbol
  [a-zA-Z]*
 end

 rule list
   '(' expression* ')'
 end    
end

Я тестирую его, как показано в руководстве, с:

parser = LispParser.new
if parser.parse('T')
  puts "Success"
else
  puts "Fail"
end

1 Ответ

1 голос
/ 17 сентября 2010

То, как вы определили правила number и symbol, они всегда совпадают (потому что * означает «ноль или более», и вы всегда можете найти ноль чего-либо).Это означает, что если вы попытаетесь выполнить синтаксический анализ "42", то сначала парсер успешно сопоставит правило symbol с пустой строкой в ​​начале, а затем не будет ожидать ввода.с +.

...