• Механическая модель электрических цепей

    Здесь даже можно будет замоделировать трансформатор и операционный усилитель, но все по порядку.

    Электрические цепи можно описать следующими уравнениями:

    • U=\dot \Phi; \qquad \Phi=LI\qquad- для катушки
    • I=\dot Q; \qquad Q=CU\qquad- для конденсатора
    • U=RI\qquad- для резистора

    (Напряжение падения на катушке равно минус ЭДС)

    В механике есть следующие уравнения:

    • F=\dot p; \qquad p=mv \qquad- для массивного тела
    • v=\dot x; \qquad x=(1/k)F \qquad- для пружины
    • F=\mu v \qquad- для вязкого трения

    (Внешняя сила, действующая на пружину равна минус силе состороны пружины, если в точке приложение силы нет массы)

    Как вы наверно догадались, электрические и механические величины можно сопоставить двумя способами:
    электро мех.1 мех.2
    U F v
    I v F
    Ф p x
    Q x p
    L m 1/k
    C 1/k m
    R \mu 1/\mu

    Читать дальше →
  • Способ написания синтаксических анализаторов на c++

    В этой статье рассказывается, как писать синтаксические анализаторы с помощью этой небольшой библиотеки на с++.

    Обычно, текст на машинном языке состоит из предложений, те — из подпредложений, а те, в свою очередь, из подподпредложений, и так вплоть до символов.

    Например, элемент xml состоит из открывающего тега, содержимого и закрывающего тега. —> Открывающий тег состоит из '<', имени тега, возможно пустого списка атрибутов и '>'. —> Закрывающий тег состоит из '</', имени тега и '>'. —> Атрибут состоит из имени, знаков '=', '"', строки символов и снова '"'. —> Содержимое в свою очередь тоже может содержать элементы. —> И т.д. Таким образом, после разбора получается синтаксическое дерево.

    Такие языки удобно описывать формой Бэкуса-Наура (БНФ), где каждый нетерминал соответствует некоторому предложению языка. Когда мы пишем программы, мы обычно разбиваем их на функции и подфункции, и раз мы собрались писать синтаксический анализатор, пусть каждому нетерминалу БНФ соответствует одна функция нашего анализатора, и пусть каждая такая функция:

    • пытается разобрать это предложение с заданной позиции
    • возвращает, удалось ли ей это сделать
    • возвращает позицию, где закончился разбор или произошла ошибка
    • а также, возможно, возвращает некоторые дополнительные данные, которые мы хотим получить в результате разбора

    Например для БНФ вида expr ::= expr1 expr2 expr3 будем писать такую функцию:
    Читать дальше →