Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/loumadev/IFJ2023
Browse files Browse the repository at this point in the history
  • Loading branch information
loumadev committed Dec 6, 2023
2 parents c2183c6 + b6020a8 commit 79dc5c9
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 5 deletions.
29 changes: 29 additions & 0 deletions docs/doc.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,12 @@ Pokud parser úspěšně zpracuje všechny vytvořené tokeny, vrátí syntaktic

#### Precedenční analýza

Precedenční analýza výrazů je implementována v souboru `ExpressionParser.c`. Analýza probíhá na základě precedenční tabulky. Pro precedenční analýzu jsou použity dva zásobníky - hlavní a pomocný, oba implementované jako dynamické pole v souboru `Array.c`. Hlavní zásobník slouží k uchování tokenů a mezivýsledků během analýzy a je z něj odebrán konečný výsledek analýzy, který je pomocí makra `ParserSucces` společně s řízením předán zpět rekurzivní analýze. Pomocný zásobník je využíván pro redukce pravidel, při kterých se vytváří jednotlivé větve AST. V případě neúspěšné redukce vrací precedenční analýza rekurzivní analýze `ParserError`. Zásobníky obsahují strukturu `StackItem`, která v sobě uchovává ukazatel na token, ukazatel na větev AST, informaci o tom, zda je token terminál nebo neterminál a v důsledku rozšíření BOOLTHEN obsahuje také informaci o tom, jestli je operátor postfixový nebo prefixový.

Obslužná rutina v případě, kdy precedenční tabulka vrátí symbol X (značící chybu), spočívá ve snaze o úspěšné zpracování (redukci) současného obsahu hlavního zásobníku. Pokud je pokus neúspěšný, vrátí precedenční analýza chybový kód a hlášku, v opačném případě se výraz úspěšně vyhodnotí.

Do precedenční analýzy bylo přidáno několik rozšíření. BOOLTHEN je implementováno přidáním operátorů do precedenční tabulky. FUNEXP a INTERPOLATION jsou řešena pomocí kontroly současně zpracovávaného a nadcházejícího tokenu. Pokud je vyhodnoceno, že se jedná o funkci nebo string interpolation, je zavolána funkce `__Parser_parseFunctionCallExpression` resp. `__Parser_parseStringInterpolation`, po zpracování části výrazu pomocnými funkcemi analýza dále pokračuje.

### Sémantická analýza

// TODO: symtable.c
Expand Down Expand Up @@ -284,6 +290,29 @@ Projekt ďalej obsahuje súčasti ako `colors.h`, ktorá definuje základné ASC

<div class="pagebreak"></div>

### Precedenční tabulka
| | + - | * / | x! | ?? | r | i | ( | ) | !x | \|\| | && | $ |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---- | --- | --- |
| __+ -__ | R | S |S | R | R | S | S | R | S | R | R | R |
|__* /__ | R | R |S | R | R | S | S | R | S | R | R | R |
| __x!__ | R | R |X | R | R | X | X | R | R | R | R | R |
| __??__ | S | S |S | S | S | S | S | R | S | S | S | R |
| __r__ | S | S |S | R | X | S | S | R | S | R | R | R |
| __i__ | R | R |R | R | R | X | X | R | X | R | R | R |
| __(__ | S | S |S | S | S | S | S | E | S | S | S | X |
| __)__ | R | R |R | R | R | X | X | R | X | R | R | R |
| __!x__ | R | R |S | R | R | S | S | R | X | R | R | R |
| __\|\|__ | S | S |S | S | S | S | S | R | S | R | R | R |
| __&&__ | S | S |S | S | S | S | S | R | S | R | R | R |
| __$__ | S | S |S | S | S | S | S | X | S | S | S | X |

Pozn.:
- r: relační operátory ==, !=, <, >, <=, >=
- i: literály
- R: >
- S: <
- E: =
- X: Invalid

---

Expand Down
69 changes: 69 additions & 0 deletions docs/ll_grammar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
## LL-Gramatika

1. program → statements
2. program → ε
3. code-block → `{` statements `}`
4. statements → statement statements
5. statements → ε
6. statement → function-declaration
7. statement → variable-declaration
8. statement → if-statement
9. statement → while-statement
10. statement → for-in-statement
11. statement → continue-statement
12. statement → break-statement
13. statement → return-statement
14. statement → expression-statement
15. expression-statement → function-call-expression
16. function-declaration → `func` function-name function-signature function-body
17. function-name → identifier
18. function-signature → parameter-clause function-result
19. function-result → `->` type
20. function-result → ε
21. function-body → code-block
22. function-body → ε
23. parameter-clause → `(` parameter-list `)`
24. parameter-list → parameter
25. parameter-list → parameter `,` parameter-list
26. parameter-list → ε
27. parameter → external-parameter-name local-parameter-name type-annotation
28. external-parameter-name → identifier
29. local-parameter-name → identifier
30. function-call-expression → function-name argument-clause
31. argument-clause → `(` argument-list `)`
32. argument-list → argument
33. argument-list → argument `,` argument-list
34. argument-list → ε
35. argument → argument-name `:` expression
36. argument → expression
37. argument-name → identifier
38. assignment-statement → variable-name `=` expression
39. variable-declaration → variable-head variable-declaration-list
40. variable-head → `let`
41. variable-head → `var`
42. variable-name → identifier
43. variable-declaration-list → variable-declarator
44. variable-declaration-list → variable-declarator `,` variable-declaration-list
45. variable-declaration-list → ε
46. variable-declarator → pattern `=` expression
47. variable-declarator → pattern
48. pattern → variable-name type-annotation
49. type-annotation → `:` type
50. type-annotation → ε
51. type → identifier
52. if-statement → `if` condition code-block else-clause
53. else-clause → `else` code-block
54. else-clause → `else` if-statement
55. else-clause → ε
56. condition → expression
57. condition → optional-binding-condition
58. optional-binding-condition → variable-head variable-declarator
59. while-statement → `while` condition code-block
60. for-in-statement → `for` variable-name `in` range code-block
61. range → expression range-operator expression
62. range-operator → `...`
63. range-operator → `..<`
64. continue-statement → `continue`
65. break-statement → `break`
66. return-statement → `return` expression
67. return-statement → `return`
31 changes: 26 additions & 5 deletions src/compiler/parser/grammar.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ IFJ23

## base

type-annotation → `:` type<br>
//type → `String` | `Int` | `Double`<br>
type → identifier // Built-in types will be resolved at semantic analysis<br>

program → statements?
code-block → `{` statements? `}`<br>

statements → statement statements

type-annotation → `:` type<br>
type → identifier

## literals

literal → numeric-literal | string-literal | boolean-literal | nil-literal<br>
Expand Down Expand Up @@ -59,6 +61,9 @@ statement → function-declaration<br>
statement → variable-declaration<br>
statement → if-statement<br>
statement → while-statement<br>
statement → for-in-statement<br>
statement → continue-statement<br>
statement → break-statement<br>
statement → return-statement<br>
statement → expression-statement<br>

Expand All @@ -76,7 +81,7 @@ function-body → code-block<br>

parameter-clause → `(` `)` | `(` parameter-list `)`<br>
parameter-list → parameter | parameter `,` parameter-list<br>
parameter → external-parameter-name? local-parameter-name type-annotation initializer?<br>
parameter → external-parameter-name local-parameter-name type-annotation initializer?<br>
external-parameter-name → identifier<br>
local-parameter-name → identifier<br>

Expand Down Expand Up @@ -120,6 +125,22 @@ else-clause → `else` code-block | `else` if-statement<br>

while-statement → `while` condition code-block<br>

## for in statement

for-in-statement → `for` variable-name `in` range code-block<br>

range → close-range | half-open-range<br>
close-range → expression...expression<br>
half-open-range → expression..<expression<br>

## continue statement

continue-statement → `continue`<br>

## break statement

break-statement → `break`<br>

## return statement

return-statement → `return` expression?<br>

0 comments on commit 79dc5c9

Please sign in to comment.