Yacc

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

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

Ծանոթագրություններ 

Ծրագրավորման գործիքներ
UNIX ծրագրային ապահովում
C-ով գրված ծրագրաշարեր
Ազատ ծրագրային ապահովում