Nano Hash - криптовалюты, майнинг, программирование

Проблемы с Flex / Bison

Я пытаюсь настроить грамматику с помощью flex / bison по следующему шаблону:

DATA: 1,2,3,4,5 PROGRAM: add,mult,div,read

Этот ввод необходимо передать в

4 add mult div read 5 1 2 3 4 5

Где: 4 - это количество команд после «PROGRAM», а 5 - это количество данных после «DATA». На данный момент у меня следующий код.

В asm.y (бизон):

%{
 #include<stdio.h>

 int comm[100];
 int data[100];
 int ncomm=0;
 int ndata=0;
%}

%token NUMBER

%%

PROGR:"DATA: "INPUT" PROGRAM: "COMMANDS
;

COMMANDS: 
| INSTR","COMMANDS
;

| NUMBER","INPUT {data[ndata]=$1; ndata++;}
;

INSTR:NUMBER {comm[ncomm]=$1; ncomm++;}
|"add" {comm[ncomm]=-10000; ncomm++;}
|"mult" {comm[ncomm]=-10001; ncomm++;}
|"div" {comm[ncomm]=-10002; ncomm++;}
|"minus" {comm[ncomm]=-10003; ncomm++;}
//and so on
;

%%
int main(int argc, char** argv)
{

 yyparse();

 printf("\n%d ",ncomm);
 int i;
 for(i=0; i<ncomm; i++)
 {
  printf("%d ",comm[i]);
 }
 printf("%d ",ndata);
 for(i=0; i<ndata; i++)
 {
  printf("%d ",data[i]);
 }

}

yyerror(char* s)
{
 printf("error: %s\n",s);
}

И в asm.l (flex):

%{
 #include "asm.tab.h"
%}

%%

[0-9]+ {return NUMBER;}

%%

В конце концов, программа выводит не правильные данные, а, например,

За

DATA: PROGRAM: add

Он печатает

DATA: PROGRAM: add

и ждем следующего ввода.

С другой стороны, для

DATA: 5 PROGRAM: add

Он печатает

DATA: error: syntax error

0 0

И я понятия не имею, что делаю не так.

26.05.2015

Ответы:


1

У тебя еще много работы. Когда вы говорите, что это работает для DATA: PROGRAM: add, это не так: вас укусила «особенность» Lex: нераспознанные символы печатаются на стандартном выводе.

So:

  • сказать Flex, что вы не хотите, чтобы неизвестные символы проходили через него.

    %option nodefault
    
  • вам нужно научить Bison использовать такие жетоны, как "DATA:". Что-то типа:

    %token ADD "add"
    %token DATA "DATA:"
    

    Затем убедитесь, что в остальной части файла указано ровно "DATA:" или DATA, например, не используйте "DATA: ".

  • вам нужен сканер / лексер, чтобы распознавать все необходимые токены: не только числа, но и ключевые слова (или идентификаторы), такие как add, mult и т. д. Что-то вроде:

    "+"  return ADD;
    

    но также "DATA:".

    "DATA:" return DATA;
    
  • Обязательно сообщите своему генератору парсера, что NUMBER имеет значение:

    %token <int> NUMBER
    
  • и скажу сканеру вычислить его.

Тебе есть чему поучиться. Прежде чем пытаться сделать все это, обязательно попробуйте основной примеры из документации Bison, чтобы лучше их понять.

27.05.2015
  • Спасибо большое, это очень помогло 27.05.2015
  • @Gcinbax Что ж, тогда вы можете нажать на мой ответ, чтобы принять его. 28.05.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..