Форум программистов, компьютерный форум CyberForum.ru

Интерпретатор - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Заданы три четырехугольника координатами своих вершин. Выяснить, есть ли среди них пересекающиеся. Построить графическую картинку http://www.cyberforum.ru/cpp-beginners/thread767679.html
1.Заданы три четырехугольника координатами своих вершин. Выяснить, есть ли среди них пересекающиеся. Построить графическую картинку. Добавлено через 1 час 24 минуты Ну же, народ, помогите :(
C++ undefined reference to `CList<int>::show()' привет ! написал этот код в eclipse #ifndef CLIST_H_ #define CLIST_H_ template<class T> class CList { public: CList(); void push_back(T); http://www.cyberforum.ru/cpp-beginners/thread767661.html
C++ Ребят доработайте код программы (программа сортировки чисел методом Шелла)
Нужна помощь Есть программа сортировки чисел методом шелла ее надо дописать чтоб она спрашивала 1 - введите сами 2 – рандом Если выбирает 1: то Введите размер массива: Введите сам массив ( его надо сделать не в столбик а в строчку) Если вводим не число то: опять 1 - введите число 2 – рандом число
Написать программу, которая по координатам камушков на поле находит вариант размещения их на двух несовпадающих окружностях C++
Долго решал, в какой же раздел форума написать, поэтому если не туда попал - прошу прощения :) Итак, сидит друг на экзамене, попросил подсобить с решением задачи: "Юный футболист Митя обнаружил на школьном футбольном поле две различные окружности, нарисованные едва заметной белой краской. Вспомнив истории о загадочных кругах на полях, он отметил эти окружности с помощью небольших камушков. Митя...
C++ Подправить код http://www.cyberforum.ru/cpp-beginners/thread767611.html
#include "stdafx.h" #include <iostream> using namespace std; const int n=10; float X; double sum(); int _tmain(int argc, _TCHAR* argv) { int i; cout<<"Massiv X"<<endl;
C++ Нахождения максимального из двух чисел 2 С помощью механизма перегрузки функций реализовать функции для нахождения максималь-ного из: 1) 2-х чисел; 2) длин 2-х строк; 3) длины строки и числа; 4) числа и длины строки. подробнее

Показать сообщение отдельно
nobless1368
14 / 14 / 1
Регистрация: 04.06.2012
Сообщений: 124
Записей в блоге: 1

Интерпретатор - C++

21.01.2013, 11:42. Просмотров 1816. Ответов 12
Метки (Все метки)

Почитал книгу по написанию компиляторов и интерпретаторов Dragon Book. На 90+ страницах есть листинг простого интерпретатора, который я третий день не могу собрать. Основная проблема в файле init.c. Прошу помочь разобраться, как исправить листинг.

global.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#pragma once
#ifndef GLOBAL_H
#define GLOBAL_H
 
#endif // GLOBAL_H
 
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
 
#define BSIZE 128
#define NONE -1
#define EOS '\0'
 
#define NUM 256
#define DIV 257
#define MOD 258
#define ID 259
#define DONE 260
 
using std::cout;
using std::endl;
 
extern int tokenval;
extern int leneno;
 
struct entry {
    char *lexptr;
    int token;
};
 
extern struct entry symtable[];
 
int parse();    //parser.cpp
int expr();
int term();
int factor();
int match(int t);
 
int lookup(char s[]);   //symbol.cpp
int insert(char s[], int tok);
 
void emit(int t, int tval); //emitter.cpp
 
int init(); //init.cpp
main.cpp
C++
1
2
3
4
5
6
7
8
9
#include "global.h"
 
int main()
{
    init();
    parse();
//    exit();
    return 0;
}
init.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "global.h"
 
struct centry keywords[]=
{
    "div", DIV,
    "mod", MOD,
    0, 0
};
 
int init()
{
    struct centry *p = keywords;
    for(; p->token; p++)        //добавить условие
        insert(p->lexptr, p->token);
    return 0;
}
emitter.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "global.h"
 
void emit(int t, int tval)
{
    switch (t) {
    case '+': case '-': case '*': case '/':
        printf ("%c\n", t) ; break;
    case DIV:
        printf ("DIV\n") ; break;
    case MOD:
        printf ("MOD\n") ; break;
    case NUM:
        printf ("%d\n", tval); break;
    case ID:
        printf ( "%s\n", symtable [tval].lexptr) ; break;
    default :
        printf ("token %d, tokenval %d\n", t, tval);
    }
}
lexer.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "global.h"
 
char lexbuf[BSIZE];
int lineno = 1;
int tokenval = NONE;
 
int lexan()
{
    int t;
    while (1) {
        t = getchar ();
        if (t == ' ' || t == '\t');
        else if (t == '\n')
            lineno++;
        else if (isdigit(t)) { /* t - цифра */
            ungetc(t, stdin);
            scanf("%d", &tokenval);
            return NUM;
        }
        else if (isalpha(t)) {
            int p, b = 0;
            while (isalnum(t)) {
                lexbuf[b++] = t;
                t = getchar();
                if (b >= BSIZE)
                    cout << "compiler error" << endl;
            }
            lexbuf[b] = EOS;
            if (t != EOF)
                ungetc(t, stdin);
            p = lookup(lexbuf);
            if (p == 0)
                p = insert(lexbuf, ID);
            tokenval = p;
            return symtable[p].token;
        }
        else if (t == EOF)
            return DONE;
        else {
            tokenval = NONE;
            return t;
        }
    }
    return 0;
}
parser.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "global.h"
#include "lexer.cpp"
 
int lookahead;
 
int parse()
{
    lookahead = lexan();
    while (lookahead != DONE) {
        expr();
        match(';');
    }
    return 0;
}
 
int expr()
{
    int t;
    term();
    while(1)
    switch(lookahead){
        case '+' : case '-' :
            t = lookahead;
            match(lookahead) ;
            term();
            emit(t, NONE);
            continue;
        default :
            return 0;
    }
    return 0;
}
 
int term()
{
    int t;
    factor ();
    while (1)
    switch (lookahead) {
        case (' * ' || '/' || DIV || MOD):
            t = lookahead;
            match (lookahead) ;
            factor();
            emit(t, NONE);
            continue;
        default :
            return 0;
    }
    return 0;
}
 
int factor()
{
    switch (lookahead) {
    case '(' :
        match ('(');
        expr();
        match(')');
        break;
    case NUM:
        emit (NUM, tokenval);
        match (NUM);
        break;
    case ID:
        emit (ID, tokenval);
        match (ID);
        break;
    default:
        cout << "syntax error" << endl;
    }
    return 0;
}
 
int match(int t)
{
    if (lookahead == t)
        lookahead = lexan();
    else cout << "syntax error" << endl;
    return 0;
}
symbol.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "global.h"
 
#define STRMAX 999
#define SYMMAX 100
 
char lexemes [STRMAX] ;
int lastchar = -1;
 
struct entry symtable [SYMMAX] ;
int lastentry = 0;
 
int lookup(char s[])
{
    int p;
    for(p = lastentry; p > 0; p --)
        if (strcmp(symtable [p].lexptr, s) == 0)
            return p;
    return 0;
}
 
int insert(char s[], int tok)
{
    int len;
    len = strlen(s);
    if (lastentry + 1 >= SYMMAX)
        cout << "symbol table full" << endl;
    if (lastchar + len + 1 >= STRMAX)
        cout << "lexemes array full" << endl;
    lastentry++;
    symtable[lastentry].token = tok;
    symtable[lastentry].lexptr = &lexemes[lastchar + 1];
    lastchar += len + 1;
    strcpy(symtable[lastentry].lexptr, s);
    return lastentry;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 03:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru