2013-03-20 7 views
2

Существуют ли правила в дистрибутиве PetitParser?PetitParser не дистрибутив?

Были следующие правила:

integerLiteral --> hexIntegerLiteral/octalIntegerLiteral/decimalIntegerLiteral 
    hexIntegerLiteral  --> hexNumeral , (integerTypeSuffix optional) 
    octalIntegerLiteral --> octalNumeral , (integerTypeSuffix optional) 
    decimalIntegerLiteral --> decimalNumeral , (integerTypeSuffix optional) 

, если я изменю их:

integerLiteral --> (hexIntegerLiteral/octalIntegerLiteral/decimalIntegerLiteral) , (integerTypeSuffix optional) 
    hexIntegerLiteral  --> hexNumeral 
    octalIntegerLiteral --> octalNumeral 
    decimalIntegerLiteral --> decimalNumeral 

затем 0777L не разбирается больше. Он должен соответствовать octalNumeral , (integerTypeSuffix optional) или в новой версии octalIntegerLiteral , (integerTypeSuffix optional), но этого не происходит.

ответ

3

Да, упорядоченный выбор в PetitParser является дистрибутивным. В вашем примере отсутствует какой-то контекст, поэтому я не знаю, почему он не работает для вас.

Оптимизатор PetitParser автоматически вносит изменения. Правило перезаписи (в несколько более общей форме) определяется как:

PPOptimizer>>#postfixChoice 
    <optimize> 

    | before prefix body1 body2 postfix after | 
    before := PPListPattern any. 
    prefix := PPPattern any. 
    body1 := PPListPattern any. 
    body2 := PPListPattern any. 
    postfix := PPPattern any. 
    after := PPListPattern any. 
    rewriter 
     replace: before/(prefix , body1)/(prefix , body2)/after 
     with: before/(prefix , (body1/body2))/after. 
    rewriter 
     replace: before/(body1 , postfix)/(body2 , postfix)/after 
     with: before/((body1/body2) , postfix)/after 

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

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