Расширенный Бакус – Наур Форма заказа операций - PullRequest
5 голосов
/ 30 марта 2012

Я создаю формальную спецификацию для очень простого языка правил, очень простого.Я хочу использовать EBNF, поскольку это стандарт, но я не могу понять, как указать порядок операций.Вот спецификация на данный момент.

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 ? ; 

У меня есть вопрос: как мне показать, что вещи в скобках должны быть оценены первыми?Так что-то вроде этого

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

Кажется, что это общая черта для большинства языков, но мои навыки работы с Google меня подводят, и я не могу найти пример.

1 Ответ

12 голосов
/ 30 марта 2012

Учитывая это в качестве упрощенного примера грамматики LL:

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

Как видите, операторы с более низким приоритетом (+ и -) имеют более общее правило, чем более высокий приоритетоператоры (* и /).Это все о создании правильного дерева разбора.Но, как правило, «внешние» или более общие правила имеют меньший приоритет, поэтому операторы сложения и вычитания помещаются рядом с term, потому что term должен быть получен в дальнейшем.Если вы посмотрите на более сложные грамматики, вы увидите, что это имеет крайний смысл, чтобы иметь надлежащий приоритет.

...