2016-07-22 4 views
1

Я хочу использовать PEG.js распознавать номера в нескольких различных форматах:Тестовые все альтернативные модели в PEG.js

number = integer 
/real 
/(integer/real) '^' (integer/real) 
/(integer/real) '^^' (integer/real) 

real = [0-9]+ '.' [0-9]* 
/[0-9]* '.' [0-9]+ 

integer = [0-9]+ 

PEG.js не ищет альтернативы, если существует частичное совпадение в начале последовательность альтернатив. Большинство чисел начинаются с целого числа, и если они этого не делают, они начинаются с реального числа. Как я могу переписать это так, чтобы он тестировал каждую альтернативу индивидуально? (Я не заинтересован в рецептуре правил в меньшем количестве правил.)

ответ

2

Попробуйте соответствие более конкретные выражения первого (потому что есть перекрытие между правилами, так что вы хотите PEG, чтобы соответствовать более конкретно первым, чтобы предотвратить частичные совпадения):

number = (real/integer) '^' (real/integer) 
/(real/integer) '^^' (real/integer) 
/real 
/integer 
+0

Извините, я не нашел проблему достаточно хорошо с моим примером, поэтому мне пришлось ее обновить. Может ли этот подход работать и с расширенным примером? –

+0

@ Pickett см. Мое редактирование. – robertklep

+0

Спасибо. Я думал, что целое или реальное будет частичным совпадением для первого правила в этом случае, теперь я понимаю, что это лишь частичное совпадение, если шаблон частично соответствует входу, а не наоборот. +1 –

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

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