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

Yacc
ՏեսակLALR parser generator?
Նախագծումը՝Սթիվեն Ջոնսոն[1]
Գրված է՝C[2]
Լույս տեսավ՝1970
Վերջին կայուն տարբերականհայտ[1]
Արտոնագիրանհայտ[1]
Անվանված էyet another?
Ելակոդtuhs.org/cgi-bin/utree.pl?file=V6/usr/source/yacc

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

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. 1,0 1,1 1,2 https://www.tuhs.org/cgi-bin/utree.pl?file=V6/usr/source/yacc
  2. http://openbsd.su/src/usr.bin/yacc/
  3. 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 թ․ հուլիսի 11-ին. Վերցված է 2014 թ․ հոկտեմբերի 31-ին.{{cite journal}}: CS1 սպաս․ location (link)
  4. «The A-Z of Programming Languages: YACC». Computerworld. Վերցված է 2012 թ․ նոյեմբերի 30-ին.
  5. ML-Yacc — իրականացում Standard ML լեզվի համար։
  6. CL-Yacc — իրականացում Common Lisp լեզվի համար։