Георги Наков, nakov.gl at gmail com
Марин Маринов, marinov.ms+tues at gmail com
Технологично училище "Електронни Системи"
07 Декември 2016г.
- текст написан в определена, предварително дефинирана граматика и синтаксис
- граматиката напомня на тази от часовете по Български, но е много по-проста и регулярна (няма изключения)
- синтакисът е ограничен и съдържа "ключови думи", които са запазени и имат специално значение
- първо трябва да разделими програмния текст на думи (също както и в естествения език)
- прилагайки правилата на граматиката трябва да създадем структури, които съдържат казаното (в натуралния език това е разпознаване на изречението като такова и разделянето му на подлог, сказуемо и пр.)
- ако казаното е граматически вярно, да се опитаме да го изпълним (да осмислим изречението и да изпълним това което е казано)
Всеки от тези етапи си има формално име:
- разделянето на текста на думи - лексически анализ или tokenization
- групиране и валидиране на думите спрямо граматиката - parsing
- изпълнението - execution или evaluation
Времето на изпълнение!
Интерпретатор | Компилатор |
---|---|
|
|
Прост език, който съдържа едиствено числа и събиране. Кодът е псевдо код.
token ADD = "+"
token (Number n) = one or more of ["0".."9"]
Tokens[] getTokens(String str) {
Tokens[] result = [];
loop {
str = skipWhitespace(str);
if (str is empty)
if (result is empty)
throw "Empty input"
else return result
if (str is "+":rest)
result.push(ADD), str = rest;
if (str is digits:rest)
result.push(Number digits), str = rest;
throw "Not a valid token"
}
}
grammar Term = Number
| Number "+" Term
data Expr = Const Number
| Add Number Expr
Expr parse(Tokens[] toks) {
if (toks is (n is Number):rest) {
if (rest is "+":rest2)
return Add n (parse rest2);
if (rest is empty)
return Const n
throw "Extra input"
}
throw "Number expected"
}
Input: "1"
Tokens: [Number 1]
Parsed: Const (Number 1)
Input: "1 + 2 + 3"
Tokens: [Number 1, "+" Number 2, "+", Number 3]
Parsed: Add (Number 1) (Add (Number 2) (Number 3))
Input "1 + 2 + +"
Tokens: [Number 1, "+" Number 2, "+", "+"]
Parsed: throws "Number expected"