Yacc
Տեսակ | LALR parser generator? |
---|---|
Նախագծումը՝ | Սթիվեն Ջոնսոն[1] |
Գրված է՝ | C[2] |
Լույս տեսավ՝ | 1970 |
Վերջին կայուն տարբերակ | անհայտ[1] |
Արտոնագիր | անհայտ[1] |
Անվանված է | yet another? |
Ելակոդ | tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/yacc |
Yacc-ը համակարգչային ծրագիր է, որը նախատեսված է LARL քերականություններից շարահյուսական վերլուծիչներ գեներացնելու համար։ Անունն առաջացել է Yet Another Compiler Compiler (Եվս մեկ կոմպիլյատորի կոմպիլյատոր) արտահայտության հապավումից։ Այս գործիքը UNIX օպերացիոն համակարգում ստեղծվել է Սթիվեն Ջոնսոնի կողմից, 1970-ական թվականներին[3]։
Ընդհանուր նկարագրություն[խմբագրել | խմբագրել կոդը]
Yacc ծրագրի մուտքին տրվում է վերլուծվող լեզվի քերականությունը՝ Բեկուսի-Նաուրի գրելաձևով[4] (BNF), որտեղ քերականական կանոնները համալրված են իմաստային (սեմանտիկ) գործողություններով։ Ամբողջ Yacc ֆայլը բաժանվում է երեք մասերի, որոնցից առաջինում գրվում են սահմանումները (տերմինալային սիմվոլների, վերլուծության ստեկի տիպի, գործողությունների նախապատվության և ասոցեատիվության և այլն), երկրորդ մասում գրվում են քերականական կանոնները՝ իմաստային գործողություններով, և վերջապես երրորդ մասում, որի առկայությունը պարտադիր չէ, գրվում են օժանդակ ֆունկցիաները։ Տեքստի նշված երեք մասերն իրարից բաժանվում են %%
նշաններով։
Սահմանումներ %% Քերականական կանոններ և սեմանտիկ գործողություններ %% Օժանդակ ֆունկցիաներ
Եթե, օրինակ, Yacc գործիքն իրականացված է C լեզվի համար, ապա լեզվի շարահյուսական վերլուծիչը պարունակող ֆայլի մշակումից հետո ստացվում է C լեզվով գրված մի մոդուլ, որում շարահյուսական վերլուծիչի մուտքի կետ է հանդիսանում int yyparse()
ֆունկցիան։ Այդ շարահյուսական վերլուծիչում ենթադրվում է, որ գոյություն ունի int yylex()
ինտերֆեյսով բառային վերլուծիչը, որն ամեն մի կանչի ժամանակ վերադարձնում է վերլուծվող տեքստի հերթական թոքենը։ Առավել հաճախ Yacc-ի հետ օգտագործվում է բառային վերլուծիչների Lex գեներատորը։
Օրինակ[խմբագրել | խմբագրել կոդը]
Yacc նկարագրության պարզագույն օրինակ կարող է ծառայել ամբողջ թվերի հետ թվաբանական գործողություններ կատարող հաշվարկիչի իրականացումը։
%{
#include <stdio.h>
%}
%left '+' '-'
%left '*' '-'
%riht NEG
%token NUMBER
%start Eval
%%
Eval : Expr '.'
{ printf("> %d\n", $$); return 0; }
Expr : Expr '+' Expr
{ $$ = $1 + $3; }
| Expr '-' Expr
{ $$ = $1 - $3; }
| Expr '*' Expr
{ $$ = $1 * $3; }
| Expr '/' Expr
{ $$ = $1 / $3; }
| '(' Expr ')'
{ $$ = $2; }
| '-' Expr %prec NEG
{ $$ = -$2; }
| NUMBER
{ $$ = $1; }
;
%%
int yyerror(const char* mes)
{
printf("Error: %s.\n", mes);
return 1;
}
Իրականացումներ[խմբագրել | խմբագրել կոդը]
Yacc գործիքը հեղինակի կողմից իրականացվել է B լեզվով և B լեզվի համար, իսկ հետագայում վերագրվել, վերասահմանվել է C լեզվի համար։ Այսօր Yacc իրականացումներ կան Java, Standard ML[5], C#, Common Lisp[6], Go և շատ այլ լեզուների համար։
Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]
- ↑ 1,0 1,1 1,2 https://www.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/yacc
- ↑ http://openbsd.su/src/usr.bin/yacc/
- ↑ Johnson Stephen C. (1975)։ «Yacc: Yet Another Compiler-Compiler»։ AT&T Bell Laboratories Technical Reports (AT&T Bell Laboratories Murray Hill, New Jersey 07974) (32)։ Արխիվացված է օրիգինալից 2011-07-11-ին։ Վերցված է հոկտեմբերի 31, 2014
- ↑ «The A-Z of Programming Languages: YACC»։ Computerworld։ Վերցված է նոյեմբերի 30, 2012
- ↑ ML-Yacc — իրականացում Standard ML լեզվի համար։
- ↑ CL-Yacc — իրականացում Common Lisp լեզվի համար։