Yacc/Lex info
2004-01-10T00:57:14+01:00
2004-01-22T18:51:04+01:00
2022-06-29T06:30:24+02:00
  • Van benne hiba, nem tökéletes, ezer éve követtem el (megnéztem, mire is lehetne használni a lex-et...):

    %{ #include<string.h> char KORzet[]="xx"; char TELhar[]="xxx"; char bejon[256]; %} GSM ^[237]"0"[2-9][0-9]{6}$ GSH ^[237]"01"[0-9]{6}$ NMT ^"60"[2-9][0-9]{5}$ NMH ^"601"[0-9]{5}$ BUD ^"1"[2-9][0-9]{6}$ BUH ^"11"[0-9]{6}$ VID ^[2-9][1-9][2-9][0-9]{5}$ VIH ^[2-9][1-9]"1"[0-9]{5}$ ABC [^0-9] ROV .{0,7} HOS .{10,}\\\\\\\\n HIB {ABC}{ROV}|{HOS}|{ROV}\\\\\\\\n %% {HIB} { printf ( " " ); } {NMT} { strncpy(TELhar, yytext+2, 3); printf ( "NMT Mobil: \\\\\\\\t (60) %s-%s\\\\\\\\n", TELhar, yytext+5 ); } {GSM} { strncpy(KORzet, yytext, 2); strncpy(TELhar, yytext+2, 3); printf ( "GSM Mobil: \\\\\\\\t (%s) %s-%s\\\\\\\\n", KORzet, TELhar, yytext+5 ); } {BUD} { strncpy(TELhar, yytext+1, 3); printf ( "Budapest: \\\\\\\\t (1) %s-%s\\\\\\\\n", TELhar, yytext+4 ); } {VID} { strncpy(KORzet, yytext, 2); strncpy(TELhar, yytext+2, 3); printf ( "Videk: \\\\\\\\t (%s) %s-%s\\\\\\\\n", KORzet, TELhar, yytext+5 ); } {GSH} { printf ( "GSM szamhiba: \\\\\\\\t %s\\\\\\\\n", yytext ); } {NMH} { printf ( "NMT szamhiba: \\\\\\\\t %s\\\\\\\\n", yytext ); } {BUH} { printf ( "BP. szamhiba: \\\\\\\\t %s\\\\\\\\n", yytext ); } {VIH} { printf ( "Vid. szamhiba: \\\\\\\\t %s\\\\\\\\n", yytext ); } %% int main(void) { const char hiba[]="hiba"; while (1) { printf ( "Telefonszam: " ); fgets( bejon, 255, stdin ); if ( strlen(bejon) < 7 ) { strcpy( bejon, hiba ); } yy_switch_to_buffer(yy_scan_string( bejon )); yylex(); yy_delete_buffer( YY_CURRENT_BUFFER ); } return(0); }
    Mutasd a teljes hozzászólást!
  • Nincs meg valakinek begépelve a Kernighan/Pike Unix op.rendszer c. könyv végén található hoc(high order calculator)?
    Mutasd a teljes hozzászólást!
  • $info flex

    Egy remek leiras yacc/lex-re. Es peldaprogramok is vannak. Konyvben egyebbkent az os Unix (Ke-Ri) van benne peldakkal stb... .
    Ha komolyabban erdekel a tema, akkor nezd meg ANTLR-t. Altalaban a Linux disztribuciok tartalmazzak. Azzal mar egesz sok minden meg lehet csinalni.
    Mutasd a teljes hozzászólást!
  • Nem tanítanak sehol Yacc/Lex-et csak nálunk?!
    Basszus, mindig megszívom.
    Mutasd a teljes hozzászólást!
  • $info flex

    Ebben a dokumentacioban van yacc meg lex is.

    Sok sikert !
    Mutasd a teljes hozzászólást!
  • Akkor te is biztos elolvastad amit én írtam. Érdekel minden új példaprogram amit küld valaki mert csak tanulhatok belőle. Ami a kalkulátor témát illeti, azt is írtam, hogy az már készen van. Ezért külön is örülök, hogy pont ilyet küldél mert más megoldások vannak benne, és így ebböl is tudok tanulni. Egyébiránt sajnos nem tudom használni.
    Azért kösz.
    Mutasd a teljes hozzászólást!
  • $info flex

    Itt van a yacc-rol es a lex-rol is. Remek leiras.
    Mutasd a teljes hozzászólást!
  • Ne haragudj, de csak irni szoktál, vagy el is olvasod amit válaszolnak neked????

    A programom pont az amit kérsz, egy kalkulátor.
    Ott van az alján a main része is amivel letesztelheted.
    Ennél többet képtelen vagyok adni...
    Mutasd a teljes hozzászólást!
  • Azt is leirom, hogy konkrétan mihez kell az anyag.
    Szoval vizsgázni fogok belőle(pécs-ttk), ahol nem igazán programot kell írni, hanem egy alap programot kiegészítgetni, ami történetesen egy kalkulátor. Négy alapművelet, zárójelezés, precedenciasorrend. Amivel legutóbb ki kellett volna egészíteni:
    -operátor string kiiratásához
    -karlánc hosszát visszaadó függvény
    eddig nagyjábol OK
    -karláncként megadott számítógépnév karláncként visszaadott IP címre alakítása és fordítva (getnamebyaddr() és getaddrbyname())
    -függvény szám karlánccá alakításához
    -operátor karláncok konkatenációjához
    Ennyi. Nem piti szerintem. És ez csak az egyik feladat a vizsgán.
    Ha valakit érdekel alapprogi akkor szóljon és felrakom vhova.
    Mutasd a teljes hozzászólást!
  • Hello. Kösz a programot, és az ötletet is, hogy a manban kéne megnézni. Én nem is gondoltam rá. A lexnek a leírása egész jó benne, de a yacc fileokrol szinte semmit nem ír(vagy csak nekem nem mondd semmit). Azert is kéne valami egyetemi jegyzet, mert az azért biztos olvasmányosabb mint egy man page. Ja és ha már itt tartunk, hogy lehet kinyomtatni egy manpage-t?
    Mutasd a teljes hozzászólást!
  • Ez egy szimpla kalkulátor programom, egy régi linuxos projecthez készült.
    "%{
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>

    #define MAXTOKENLEN 128

    //#define YYSTYPE int
    //#define FPFSTR "%i"

    #define YYSTYPE double
    #define FPFSTR "%f"

    extern int sc_lex(void);
    extern int sc_error(const char *s);
    extern int sc_parse(void);


    YYSTYPE result;
    char *p;
    int len;

    YYSTYPE strcalc(char * src)
    {
    p = src;
    len = strlen(p);
    result = 0;
    sc_parse();
    snprintf(src, len, FPFSTR, result);
    return result;
    }

    %}

    %token EOS NUMBER
    %left '+' '-'
    %left '*' '/'
    %right UMINUS
    %left '(' ')'

    %%

    source : expr EOS { result = $1; return 1; }
    | EOS { result = 0; return 1; }
    ;
    expr : NUMBER { $$ = $1; }
    | expr '+' expr { $$ = $1 + $3; }
    | expr '*' expr { $$ = $1 * $3; }
    | expr '-' expr { $$ = $1 - $3; }
    | expr '/' expr { $$ = $1 / $3; }
    | '(' expr ')' { $$ = $2; }
    | '-' expr %prec UMINUS { $$ = - $2; }
    ;
    %%
    int sc_lex(void)
    {
    const char cToken[] = "+*-/()";
    #if 0
    const struct token {
    const char *name;
    int value;
    } sToken[] = {
    { NULL, 0 }
    };
    #endif
    char c;
    sc_lval = 0;
    while((c = *p++) <= ' ') {
    if (c == 0) {
    return EOS;
    }
    }
    // NUMBER
    if (isdigit(c) || (c == '.' && isdigit(*p))) {
    double d;
    d = strtod(--p, &p);
    sc_lval = (YYSTYPE)d;
    while (*p == ' ') p++;
    if (*p && strchr("GMkmun", *p)) {
    switch (*p++) {
    case 'G': sc_lval *= 1000000000; break;
    case 'M': sc_lval *= 1000000; break;
    case 'k': sc_lval *= 1000; break;
    case 'm': sc_lval /= 1000; break;
    case 'u': sc_lval /= 1000000; break;
    case 'n': sc_lval /= 1000000000; break;
    }
    }
    return NUMBER;
    }
    // Egybetus tokenek + tobb karakteres irasjelekbol allo tokenek
    if (strchr(cToken, c)) {
    return c;
    }
    #if 0
    char b[MAXTOKENLEN];
    char * bp = b;
    *bp++ = c;
    while (isalnum(c = *p++) || c == '_') *bp++ = c;
    if (!c) --p;
    for (const struct token *p = sToken; p->name; p++) {
    if (*(yylval.s) == p->name) {
    delete yylval.s;
    return p->value;
    }
    }
    #endif
    sc_error("Invalid token");
    return EOS;
    }
    /* ****************************************************************** */
    int sc_error(const char *s)
    {
    fprintf(stderr, s);
    return 0;
    }

    #ifdef TEST

    void test(char * s)
    {
    YYSTYPE r;
    printf("\\\\\\\\"%s\\\\\\\\" : ", s);
    r = strcalc(s);
    printf(FPFSTR, r);
    printf(", \\\\\\\\"%s\\\\\\\\"\\\\\\\\n", s);
    }

    int main(int argc, char *argv[])
    {
    while (1) {
    char b[1000];
    fgets(b, sizeof(b), stdin);
    if (feof(stdin)) break;
    test(b);
    }
    return 0;
    }
    #endif
    "
    Mutasd a teljes hozzászólást!
  • Pontosabban mi erdekel amit nem talalsz meg a MAN-ban?
    Mutasd a teljes hozzászólást!
  • Sziasztok!
    Jó lenne, ha tudna valaki magyar Yacc/Lex leírást adni, valami egyetemi jegyzet ilyesmi, mert így első nekifutásra nagyon nem vágom hogyan működik.
    Érdekelne még commentelt példaprogram is, ha van valakinek.
    Mutasd a teljes hozzászólást!
Címkék
abcd