Yacc

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Yacc
Տեսակ compiler-compiler և standard UNIX utility
Նախագծումը՝ Սթիվեն Ջոնսոն[1]
Գրված է՝ C[2]
Լույս տեսավ՝ 1970
Արտոնագիր Lucent Public License[3]
Հաջորդ Berkeley Yacc[4]
Աղբյուր կոդ openbsd.su/src/usr.bin/yacc/

Yacc-ը համակարգչային ծրագիր է, որը նախատեսված է LARL քերականություններից շարահյուսական վերլուծիչներ գեներացնելու համար։ Անունն առաջացել է Yet Another Compiler Compiler (Եվս մեկ կոմպիլյատորի կոմպիլյատոր) արտահայտության հապավումից։ Այս գործիքը UNIX օպերացիոն համակարգում ստեղծվել է Սթիվեն Ջոնսոնի կողմից, 1970-ական թվականներին[5]։

Ընդհանուր նկարագրություն[խմբագրել | խմբագրել կոդը]

Yacc ծրագրի մուտքին տրվում է վերլուծվող լեզվի քերականությունը՝ Բեկուսի-Նաուրի գրելաձևով[6] (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[7], C#, Common Lisp[8], Go և շատ այլ լեզուների համար։

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]

  1. http://mdoc.su/o58/yacc.1
  2. http://openbsd.su/src/usr.bin/yacc/
  3. http://mdoc.su/o/yacc.1 OpenBSD.
  4. 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)։ Վերցված է հոկտեմբերի 31, 2014 
  5. «The A-Z of Programming Languages: YACC»։ Computerworld։ Վերցված է նոյեմբերի 30, 2012 
  6. ML-Yacc — իրականացում Standard ML լեզվի համար։
  7. CL-Yacc — իրականացում Common Lisp լեզվի համար։