Как я могу реализовать конструкции #include с Flex и YACC?

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

12
задан Gozzy 16 February 2010 в 00:35
поделиться

2 ответа

Я использую JSP в течение многих лет, и расширяемость, как правило, делает номинальную стоимость ежемесячного хостинга больше, чем стоит. Тем не менее, если вам нужно разместить базовый информационный или возобновить тип страницы, вам, вероятно, не понадобится JBoss или какая-либо другая кувалда.

JSP/Java открывает возможности для использования Java на уровне контроллера (вероятно, вы уже использовали или слышали о расширенном объединении соединений, распределенном кэшировании, планировании с помощью Quartz, Hibernate object/relational persistence). А затем вы можете запустить Java на любой машине с JVM. Синтаксис JSP не является невероятно сложным, хотя и имеет кривую обучения. Что касается хостинга, eatj.com был довольно хорош до сих пор.

На стороне PHP можно легко интегрировать такие функции сообщества, как Wordpress. Хотя вы можете использовать nWordPress для Java, это просто не то же самое. Facebook, вероятно, одна из крупнейших реализаций PHP, использует HipHop и значительно снизила требования к процессорам.

Вашему проекту также может быть легче укомплектоваться разработчиками PHP, поскольку они относительно более просты в реализации, чем разработчики JSP. Я бы сказал, узнайте JSP и/или Ruby - это открывает еще несколько дверей, и вы в конечном итоге можете предпочесть один метод другому.

-121--4501481-

Они называются Синтаксические диаграммы (или железнодорожные диаграммы).

Их можно создать с помощью Visio или Creative Docs .NET

Для получения дополнительной информации см.

Инструмент для создания диаграммы железных дорог, используемый на json.org

-121--3665277-

Руководство Flex описывает, как это сделать с помощью yypush_buffer_state () и yypop_buffer_state ().

Здесь - раздел официального руководства по использованию нескольких входных буферов. Есть образец кода.

8
ответ дан 2 December 2019 в 21:23
поделиться

Общение между лексической и синтаксической фазами вашего процессора - это нормально.

Итак, распознайте синтаксис директивы include в вашем синтаксическом анализаторе (или, чтобы упростить ситуацию, просто распознайте ее в лексическом анализаторе) и выполните переключение на лексическом уровне.

Например, вот простой язык, который распознает строки стандартного ввода, содержащие ab или cd или .file. Когда он видит .someString, он открывает someString как включаемый файл, а затем возвращается к чтению стандартного ввода.

%{
#include <stdio.h>
#include <stdlib.h>
void start_include(char *); int yylex(void); void yyerror(void *);
#define YYSTYPE char *
%}
%%
all:          all others | others;
others:       include_rule | rule_1 | rule_2 | 'Z' { YYACCEPT; };
include_rule: '.' '\n' { start_include($1); };
rule_1:       'a' 'b' '\n' { printf("random rule 1\n"); };
rule_2:       'c' 'd' '\n' { printf("random rule 2\n"); };
%%
FILE * f = NULL;
void start_include(char *s) {
        if ((f = fopen(s, "r")) == NULL)
                abort();
}
int yylex(void) {
        int c;
        static char s[100];
        if (f == NULL)
                f = stdin;
        c = getc(f);
        if (c == EOF) {
                f = stdin;
                c = getc(f);
        }
        if (c == '.') {
                scanf(" %s", s);
                yylval = s;
        } else if (c == EOF)
                return 'Z';
        return c;
}

И когда мы запускаем его...

$ cat > toplevel
ab
.myinclude
ab
$ cat > myinclude
cd
cd
$ yacc ip.y && cc -Wall y.tab.c -ly && ./a.out < toplevel
random rule 1
random rule 2
random rule 2
random rule 1
$ 
5
ответ дан 2 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: