Yacc
Տեսակ | LALR parser generator? |
---|---|
Նախագծումը՝ | Սթիվեն Ջոնսոն[1] |
Գրված է՝ | Սի (ծրագրավորման լեզու)[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 թ․ հուլիսի 11-ին. Վերցված է 2014 թ․ հոկտեմբերի 31-ին.
{{cite journal}}
: CS1 սպաս․ location (link) - ↑ «The A-Z of Programming Languages: YACC». Computerworld. Վերցված է 2012 թ․ նոյեմբերի 30-ին.
- ↑ ML-Yacc — իրականացում Standard ML լեզվի համար։
- ↑ CL-Yacc — իրականացում Common Lisp լեզվի համար։