Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2017, 18:33   #11
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Консоль это не язык.

Вот например вполне корректный код C# в консольном проекте. Даже без библиотек, LINQ, дженериков и т.п.

Код:
using System;

namespace ConsoleApplication25
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello\tworld\r\n");
            Console.WriteLine(@"Hello
World");

            double f = 42;
            int i = (int) f;

            var products = new[]
            {
                new Product("Milk", 100),
                new Product("Bread", 150.8m),
                new SuperProduct("!!!"), 
            };

            Console.WriteLine(products.Length);
            Console.WriteLine(products[0] == products[1]);
            Console.WriteLine(products[0] == new Product("Milk", 100));

            foreach (var product in products)
            {
                Console.WriteLine(product);
            }

            Console.WriteLine(new Product(null, products[0].Price).Price + "$");

            var p = new SuperProduct(null);
            p.SomeEvent += (sender, s) =>
            {
                Console.WriteLine("Hello event");
            };
            p.Foo().Foo();

            Console.WriteLine(ReverseString("Reversed string"));
            Console.WriteLine("Reversed string".MyReverse());
        }

        public static string ReverseString(string str)
        {
            return str.Length == 0 ? str : str[str.Length - 1] + ReverseString(str.Substring(0, str.Length - 1));
        }

        class Product : IEquatable<Product>
        {
            public Product(string name, decimal price)
            {
                Name = name;
                Price = price;
            }

            public string Name { get; }
            public decimal Price { get; }

            public delegate void MyEventHandler(object sender, string arg);

            public event MyEventHandler SomeEvent;

            protected virtual void OnSomeEvent(string arg)
            {
                SomeEvent?.Invoke(this, arg);
            }

            public override string ToString()
            {
                return $"Name: {Name}, Price: {Price}";
            }

            public bool Equals(Product other)
            {
                if (ReferenceEquals(null, other)) return false;
                if (ReferenceEquals(this, other)) return true;
                return string.Equals(Name, other.Name) && Price == other.Price;
            }

            public override bool Equals(object obj)
            {
                if (ReferenceEquals(null, obj)) return false;
                if (ReferenceEquals(this, obj)) return true;
                if (obj.GetType() != this.GetType()) return false;
                return Equals((Product) obj);
            }

            public override int GetHashCode()
            {
                unchecked
                {
                    return ((Name != null ? Name.GetHashCode() : 0)*397) ^ Price.GetHashCode();
                }
            }

            public static bool operator ==(Product left, Product right)
            {
                return Equals(left, right);
            }

            public static bool operator !=(Product left, Product right)
            {
                return !Equals(left, right);
            }
        }

        class SuperProduct : Product
        {
            public SuperProduct(string name) : base(name, 99999)
            {
            }

            public SuperProduct Foo()
            {
                OnSomeEvent(null);
                return this;
            }
        }
    }

    public static class MyExtension
    {
        public static string MyReverse(this string obj)
        {
            return Program.ReverseString(obj);
        }
    }
}
https://ideone.com/cKiN7Y
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 18.03.2017 в 19:33.
Alex11223 вне форума Ответить с цитированием
Старый 21.03.2017, 10:59   #12
Kef1r
Форумчанин
 
Регистрация: 13.05.2016
Сообщений: 111
По умолчанию

Прочитал я всякой всячины по поводу деревьев, компиляторов, но в голове одна каша. Может посоветуете какие-нибудь книги, которые могут мне помочь с реализацией?
Kef1r вне форума Ответить с цитированием
Старый 21.03.2017, 11:48   #13
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

http://stackoverflow.com/a/1672/964478

Когда мне надо было написать компилятор (в JVM байткод) в вузе, то я использовал ANTLR для парсинга и читал по нему Definitive ANTLR Reference + "Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages" (ну вторая наверно и без ANTLR может быть полезна... тем более что в ней все равно используют 3 ANTLR, а не 4, там много отличий) + прочитал несколько глав в Dragon Book, но потом забил на него.

Препод рекомендовал Appel A. W. "Modern Compiler Implementation in ML" (есть еще in C, in Java, но вроде они хуже), но я как-то не дошел до нее и не понадобилось.

Ну и гуглил что-то, смотрел всякие примеры и немного код реальных компиляторов на гитхабе (Groovy, Jython, Kotlin, ...)

Насчет деревьев, если использовать ANTLR, то в актуальной версии он умеет (если без извращений) строить только свое дерево парсинга (вроде CST называется). Предполагается, что для большинства задач этого хватит/не возникнет неудобств, там еще есть listener'ы/visitor'ы для него. Но при желании можно и в свое AST конвертировать, это не сложно, как-то так http://stackoverflow.com/a/29996191/964478

На ютубе еще немного посмотрел это https://www.youtube.com/playlist?lis...fWwBAmJAYV4iUm (немецкий, но в первых ~10 видео есть англ субтитры)

Еще недавно на эту тему видел
https://www.youtube.com/watch?v=-E2tu3MqR24
может быть поможет какими-то идеями в целом
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 21.03.2017 в 12:01.
Alex11223 вне форума Ответить с цитированием
Старый 21.03.2017, 16:52   #14
Kef1r
Форумчанин
 
Регистрация: 13.05.2016
Сообщений: 111
По умолчанию

Спасибо большое)
Kef1r вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как создать свой языковый переводчик? midoxxx Помощь студентам 20 09.10.2016 16:58
Сколько языков программирования в кс 1.6 ? Pekky Свободное общение 19 15.06.2015 00:48
Теория языков программирования Tesmont Помощь студентам 1 03.02.2011 13:40
Как компиляторы для языков программирования пишутся на самих себе? bullvinkle Свободное общение 29 19.03.2010 15:47
совмещение 2-х языков программирования fis Общие вопросы Delphi 5 30.01.2007 20:13