ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ANTLR ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΠΎΠ½ΡΡΠΈΠΉ
ANTLR (ANother Tool for Language Recognition) β ΡΡΠΎ ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ°ΡΡΠ΅ΡΠΎΠ², ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ² ΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ. ΠΠ½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ , ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ².
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ ANTLR
-
ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ°: Π€ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠ·ΡΠΊΠ°. Π ANTLR Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ ΠΏΠΈΡΡΡΡΡ Π² ΡΠ°ΠΉΠ»Π°Ρ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ
.g4ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π·Π±ΠΈΠ²Π°ΡΡ Π²Ρ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. -
ΠΠ΅ΠΊΡΠ΅Ρ (Lexer): ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΠΊΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ². Π’ΠΎΠΊΠ΅Π½Ρ β ΡΡΠΎ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ, ΡΠΈΡΠ»Π°, ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΈ Ρ.Π΄.
-
ΠΠ°ΡΡΠ΅Ρ (Parser): ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½Ρ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π»Π΅ΠΊΡΠ΅ΡΠΎΠΌ, Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ. ΠΠ°ΡΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠΊΠ΅Π½Π°ΠΌΠΈ.
-
ΠΡΠ°Π²ΠΈΠ»Π° Π»Π΅ΠΊΡΠ΅ΡΠ° ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ°: Π Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ΅ ANTLR ΠΏΡΠ°Π²ΠΈΠ»Π° Π»Π΅ΠΊΡΠ΅ΡΠ° ΠΎΠ±ΡΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π·Π°Π³Π»Π°Π²Π½ΡΠΌΠΈ Π±ΡΠΊΠ²Π°ΠΌΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ, ΠΊΠ°ΠΊ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠΎΠΊΠ΅Π½Ρ. ΠΡΠ°Π²ΠΈΠ»Π° ΠΏΠ°ΡΡΠ΅ΡΠ° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΡΡΡΠΎΡΠ½ΡΠΌΠΈ Π±ΡΠΊΠ²Π°ΠΌΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΎΠΊΠ΅Π½Ρ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π°.
-
ΠΠ΅ΡΠ΅Π²ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° (Parse Tree): ΠΠ΅ΡΠ°ΡΡ ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ . Π£Π·Π»Ρ Π΄Π΅ΡΠ΅Π²Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ, Π° Π»ΠΈΡΡΡΡ β ΡΠΎΠΊΠ΅Π½Π°ΠΌ.
-
ΠΠΎΡΠ΅ΡΠΈΡΠ΅Π»ΠΈ (Visitors) ΠΈ ΡΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ (Listeners): ΠΠ°ΡΡΠ΅ΡΠ½Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΎΠ±Ρ ΠΎΠ΄Π° Π΄Π΅ΡΠ΅Π²Π° ΡΠ°Π·Π±ΠΎΡΠ°. ΠΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠ·Π»ΠΎΠ² Π΄Π΅ΡΠ΅Π²Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠΎΠ΄Π°.
ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ANTLR
-
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ: Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ°ΠΉΠ» Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ
.g4, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΈΠ»ΠΈ ΡΠΎΡΠΌΠ°ΡΠ° Π΄Π°Π½Π½ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠ°Π²ΠΈΠ» Π»Π΅ΠΊΡΠ΅ΡΠ° ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ°. -
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠΎΠ΄Π°: ANTLR Π±Π΅ΡΠ΅Ρ ΡΠ°ΠΉΠ» Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π»Π΅ΠΊΡΠ΅ΡΠ° ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ° Π½Π° Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Java, Python, C#, Rust ΠΈ Π΄Ρ.).
-
ΠΠ΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·: Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π»Π΅ΠΊΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΠΊΡΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π΅Π³ΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠ°Π²ΠΈΠ» Π»Π΅ΠΊΡΠ΅ΡΠ°.
-
Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·: ΠΠ°ΡΡΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠΊΠ΅Π½Ρ ΠΎΡ Π»Π΅ΠΊΡΠ΅ΡΠ° ΠΈ ΡΡΡΠΎΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΠ°ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ .
-
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π°: Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»Π΅ΠΉ ΠΈΠ»ΠΈ ΡΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΠ±Ρ ΠΎΠ΄ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π° Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ β ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ Ρ.Π΄.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ β ΠΏΠ°ΡΡΠ΅Ρ Π΄Π»Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
Π¨Π°Π³ 1: ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ
grammar Expr;
// ΠΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ° Π΄Π»Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
expr: expr ('+' | '-') term # AddSub
| term # SingleTerm
;
// ΠΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠ΅ΡΠΌΠΎΠ²
term: term ('*' | '/') factor # MulDiv
| factor # SingleFactor
;
// ΠΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠ°ΠΊΡΠΎΡΠΎΠ²
factor: INT # Int
| '(' expr ')' # ParenthesizedExpr
;
// ΠΡΠ°Π²ΠΈΠ»ΠΎ Π»Π΅ΠΊΡΠ΅ΡΠ° Π΄Π»Ρ ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ΅Π»
INT: [0-9]+ ;
// ΠΡΠ°Π²ΠΈΠ»ΠΎ Π»Π΅ΠΊΡΠ΅ΡΠ° Π΄Π»Ρ ΠΏΡΠΎΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ²
WS: [ \t\r\n]+ -> skip ;
Π¨Π°Π³ 2: ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ΄
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ANTLR, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π»Π΅ΠΊΡΠ΅Ρ ΠΈ ΠΏΠ°ΡΡΠ΅Ρ Π΄Π»Ρ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
Π¨Π°Π³ 3: ΠΠ΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·
ΠΠ΅ΠΊΡΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΠΊΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 3 + 4 * (2 - 1), ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π΅Π³ΠΎ Π² ΡΠΎΠΊΠ΅Π½Ρ:
INT('3')'+'INT('4')'*''('INT('2')'-'INT('1')')'
Π¨Π°Π³ 4: Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·
ΠΠ°ΡΡΠ΅Ρ ΡΡΡΠΎΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ²:
expr
/ \
expr term
| |
term factor
| |
factor '(' expr ')'
| |
INT expr
/ \
expr ('-' expr)
| |
term term
| |
factor factor
| |
INT INT
Π¨Π°Π³ 5: ΠΠ±Ρ ΠΎΠ΄ Π΄Π΅ΡΠ΅Π²Π° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ, ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ:
class EvalVisitor(ExprVisitor):
def visitAddSub(self, ctx):
left = self.visit(ctx.expr(0))
right = self.visit(ctx.expr(1))
if ctx.getChild(1).getText() == '+':
return left + right
else:
return left - right
def visitMulDiv(self, ctx):
left = self.visit(ctx.term(0))
right = self.visit(ctx.term(1))
if ctx.getChild(1).getText() == '*':
return left * right
else:
return left / right
def visitInt(self, ctx):
return int(ctx.INT().getText())
def visitParenthesizedExpr(self, ctx):
return self.visit(ctx.expr())
Π¨Π°Π³ 6: Π Π΅Π·ΡΠ»ΡΡΠ°Ρ
ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ Π²Ρ
ΠΎΠ΄Π½ΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ 3 + 4 * (2 - 1) ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»Ρ Π²ΡΡΠΈΡΠ»ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ:
2 - 1 = 1
4 * 1 = 4
3 + 4 = 7
ΠΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅: 7
ΠΠ°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ANTLR?
- Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ: ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ·ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°.
- ΠΡΠΎΡΡΠΎΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ: ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΡΠ·ΡΠΊΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ EBNF-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡ.
- ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ: ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ.
- ΠΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ: ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΎΠ±ΡΠΈΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ANTLR.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
- ΠΡΡΡΡΠ°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»Π΅ΠΊΡΠ΅ΡΠΎΠ² ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠΎΠ², ΡΠΎΠΊΡΠ°ΡΠ°Ρ Π²ΡΠ΅ΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ: ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌΠΈ ΡΠ·ΡΠΊΠΎΠ²ΡΠΌΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈ.
- Π Π°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΡ: ΠΠ΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ANTLR ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠΎΡΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈ ΡΠ·ΡΠΊΠ°ΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΠΎΠ½ΡΡΠΈΠΉ ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ, ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΡ, ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΡ ΠΈ ΠΏΠ°ΡΡΠ΅ΡΡ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ² Π΄Π°Π½Π½ΡΡ .
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΡΠ΅ ΡΠ°Π³ΠΈ Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ANTLR:
-
ΠΠ·ΡΡΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ½ΡΡΠΈΡ: ΠΠΎΠΉΠΌΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π»Π΅ΠΊΡΠ΅ΡΡ, ΠΏΠ°ΡΡΠ΅ΡΡ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ.
-
ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΠΏΡΠΎΡΡΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ: ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ·ΡΠΊ ΠΈΠ»ΠΈ ΡΠΎΡΠΌΠ°Ρ Π΄Π°Π½Π½ΡΡ .
-
Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΊΠΎΠ΄: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ANTLR Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΡΠΉΡΠ΅ Π΅Π³ΠΎ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
-
ΠΠ·ΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΡΠ΅ΠΌΡ: ΠΠΎΡΠ΅ΡΠΈΡΠ΅Π»ΠΈ, ΡΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊ.
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ:
- ΠΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ ANTLR
- ΠΠ½ΠΈΠ³Π° βThe Definitive ANTLR 4 Referenceβ (Π½Π° Π°Π½Π³Π».)
- Π£ΡΠ΅Π±Π½ΠΈΠΊΠΈ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ Π½Π° GitHub
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ANTLR, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎ Π°Π½Π°Π»ΠΈΠ·Ρ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠ·Π΄Π°Π²Π°Ρ Π½Π°Π΄Π΅ΠΆΠ½ΡΠ΅ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ.