2010-09-17 3 views
1

Я пишу небольшой, очень простой синтаксический анализатор в рубине с драгоценным камнем в виде верхушки, чтобы поэкспериментировать с ним. Однако на самом деле это не так, как я хочу, и документация довольно бедна, поэтому трудно понять, что я делаю неправильно. В настоящее время грамматика может совпадать как с символом, так и с булевым, но не с числом. Однако, когда я переключаю порядок в правиле атома, например, на 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

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

Чтобы исправить это, просто замените * на +.

+0

Thankyou, который отлично работает сейчас. – bennybdbc

+0

@bennybdbc: Также, как теперь определено правило 'atom', оно никогда не будет соответствовать логическому, потому что' T' и 'F' также соответствуют регулярному выражению в правиле' symbol', поэтому они всегда будут анализироваться как символ. –

+0

@Jorg - Да, спасибо, я заметил это раньше. Я изменил код в своей программе, я просто не думал редактировать этот вопрос. – bennybdbc

 Смежные вопросы

  • Нет связанных вопросов^_^