2012-03-29 3 views
4

Je crée une spécification formelle pour un langage de règles très simple, très simple. Je veux utiliser EBNF car c'est une norme mais je ne peux pas comprendre comment spécifier l'ordre des opérations. Voici la spécification jusqu'à présent.Ordre des opérations étendu Backus-Naur Form

rule = statement, { (‘AND’|’OR’), statement}; 

variable = ‘$’,alphabetic character, {alphabetic character | digit}; 

statement = variable, [ ‘count’,[white space ],’>’,[white space],number ]; 

alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G" 
        | "H" | "I" | "J" | "K" | "L" | "M" | "N" 
        | "O" | "P" | "Q" | "R" | "S" | "T" | "U" 
        | "V" | "W" | "X" | "Y" | "Z" ; 

number = [ "-" ] , digit , { digit } ; 

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; 

white space = ? white space characters ? ; 

La question que j'ai est de savoir comment montrer que les choses entre parenthèses doivent être évaluées en premier. donc quelque chose comme ça

$strap AND ($greenSticker count > 5 OR ($greenSticker AND $redSticker)) 

Il semble comme une caractéristique commune à la plupart des langues, mais mes compétences Google me parvient pas et je ne peux pas sembler trouver un exemple.

Répondre

11

Compte tenu de cela comme une grammaire simplifiée par exemple LL:

expression -> (+|-|ε) term ((+|-) term)* 
term -> factor ((*|/) factor)* 
factor -> var | number | (expression) 

Comme vous pouvez le voir, les opérateurs de priorité inférieure (+ et -) sont en règle générale plus générale que les opérateurs de priorité plus élevé (* et /). Il s'agit de produire l'arbre d'analyse correct. Mais en règle générale, les règles "externes" ou plus générales ont moins de priorité, ce qui explique pourquoi les opérateurs d'addition et de soustraction sont placés à côté de term, car term doit être dérivé. Si vous regardez des grammaires plus compliquées, vous verrez que cela est pris à l'extrême pour avoir la priorité appropriée.

+1

En exprimant la priorité dans les règles de grammaire, je ne vois pas pourquoi vous faites une distinction entre l'analyse descendante et ascendante. Comme vous l'avez dit, il s'agit de produire l'arbre d'analyse correct, et vous construisez juste ce top-down ou bottom-up, pour arriver finalement au même résultat. Bien sûr, cela a quelques implications, mais ce n'est pas évident pour moi comment vous reliez la technique d'analyse syntaxique à (cette sorte de) préséance. S'il vous plaît, expliquez. – Gunther

+1

Cette grammaire d'expression fonctionnera aussi bien dans un analyseur ascendant que dans un analyseur LL top-down, et pas seulement dans les analyseurs syntaxiques de descente récursive. Un parser Pratt est récursif-descendant et de haut en bas aussi. Votre deuxième paragraphe n'a vraiment aucun sens pour moi. – EJP

+0

Pour répondre à vos deux problèmes, je viens d'enlever le paragraphe confus. J'espère que le reste de ma réponse est bénéfique! –

Questions connexes