none
Как написать код для токенизации информации которую программа читает из файла? RRS feed

  • Вопрос

  • Кто нибудь подскажет как написать код для токенизации информации которую программа читает из файла?
    Если несложно хорошо было бы код)))но и алгоритм тоже годится!!!
    • Изменено YatajgaEditor 27 октября 2014 г. 8:34 Title
    • Перемещено YatajgaEditor 27 октября 2014 г. 8:35
    24 октября 2014 г. 11:23

Ответы

  • Синтаксический анализ - это целый пласт науки. Всё зависит от сложности грамматики вашего языка.

    Если у вас будет полноценный скриптовый язык, то стоит обратить внимание на генераторы парсеров, такие как ANTLR, Bison, Coco/R, Yacc и другие. Освоение генератора займёт время, зато в дальнейшем будет очень легко изменять ваш интерпретатор.

    Если всё же решите писать парсер вручную, обратите внимание на метод рекурсивного спуска.

    Если кто-то заинтересуется этим методом, советую книгу "Полный справочник по C#", Герберт Шилдт, глава 26 "Синтаксический анализ методом рекурсивного спуска". Всю книгу целиком читать не советую, т. к. она весьма старая, по самой первой версии языка. Но именно эту главу рекомендую. В ней описано создание калькулятора, который понимает выражения со скобками, с переменными и прочее.

    24 октября 2014 г. 16:32

Все ответы

  • Добрый день.

    1. В заголовок лучше писать вопрос, так проще будет тем, кто в дальнейшем будет искать по форуму.

    2. Читаете посимвольно из файла, и смотрите что вы там считали. Если то что считали еще относиться к текущему токену, то прибавляете это к нему, если нет, то имеющийся сохраняете в коллекцию, и начинаете новый. Например, разбираем строку содержащую числа и операции:

    static void Main(string[] args)
    {
        string source = "34+1*2345";
        List<string> tokens = new List<string>();
        string token = "";
        int index = 0;
        char[] symbols = { '+', '-', '*', '/' };
        while (index < source.Length)
        {
            if (symbols.Contains(source[index]))
            {
                if (token.Length > 0)
                {
                    tokens.Add(token);
                    token = "";
                }
                tokens.Add(source[index].ToString());
            }
            else
            {
                token += source[index];
            }
            index++;
        }
        if (token.Length > 0)
        {
            tokens.Add(token);
        }
        foreach (var item in tokens)
        {
            Console.WriteLine(item);
        }
        Console.ReadKey();
    }

    Как работает:

    24 октября 2014 г. 11:51
    Отвечающий
  • спасибо за все!!!но этот код для C#,а мне нужен C++
    сможете помочь?
    24 октября 2014 г. 12:24
  • Я точно нет. Но алгоритм то простой, синтаксис похожий, если что не понятно, спросите, давайте объясню, что происходит.

    24 октября 2014 г. 12:28
    Отвечающий
  • Ну я собираюсь писать интерпретатор и мне нужно чтобы программа открыла файл где будет написан некий код,и после этого я хочу разделить все по токенам чтобы узнать что там написан и решать задачу!!!
    ну а файл будет содержать примерно такой код
    var x=7;
    int y=x;
    var z=x+y;
    print x;

     

    24 октября 2014 г. 12:46
  • Ну я собираюсь писать интерпретатор и мне нужно чтобы программа открыла файл где будет написан некий код,и после этого я хочу разделить все по токенам чтобы узнать что там написан и решать задачу!!!
    ну а файл будет содержать примерно такой код
    var x=7;
    int y=x;
    var z=x+y;
    print x;
    24 октября 2014 г. 12:47
  • Посмотрите данный проект, написать такое самому для очень простого кода можно, дальше будет очень сложно.

    Сделаем содержимое сообщества лучше, вместе!

    24 октября 2014 г. 15:14
    Модератор
  • Синтаксический анализ - это целый пласт науки. Всё зависит от сложности грамматики вашего языка.

    Если у вас будет полноценный скриптовый язык, то стоит обратить внимание на генераторы парсеров, такие как ANTLR, Bison, Coco/R, Yacc и другие. Освоение генератора займёт время, зато в дальнейшем будет очень легко изменять ваш интерпретатор.

    Если всё же решите писать парсер вручную, обратите внимание на метод рекурсивного спуска.

    Если кто-то заинтересуется этим методом, советую книгу "Полный справочник по C#", Герберт Шилдт, глава 26 "Синтаксический анализ методом рекурсивного спуска". Всю книгу целиком читать не советую, т. к. она весьма старая, по самой первой версии языка. Но именно эту главу рекомендую. В ней описано создание калькулятора, который понимает выражения со скобками, с переменными и прочее.

    24 октября 2014 г. 16:32
  • Надо что программа была консольной и написан на C++ .Грамматика языка проста,примерно такой код будет 
    var x=7;
    int y=x;
    var z=x+y;
    print x;
    надо что интерпретатор читал и решил его строка за строкой 
    24 октября 2014 г. 18:37
  • мне нужен для простого интерпретатора и на языке C++
    24 октября 2014 г. 18:40