JLex Сканер Генерация - PullRequest
       13

JLex Сканер Генерация

0 голосов
/ 01 марта 2011

Я использую JLex для нашего последнего задания, пытаясь сгенерировать сканер для языка, предоставленного нам профессором.

На данный момент у меня написано следующее - предположим, что ключевые слова и правила идентификаторов являются правильными для языка, с которым мы работаем.

import java.io.*;
%%
%{
    public static void main(String argv[]) throws java.io.IOException
    {
            MyLexer yy= new MyLexer(new FileReader("input"));
            while( yy.yylex() >= 0);
    }
%}

%integer
%class MyLexer
INT =int
KEYWORDS =IF|ELSE|WRITE|READ|RETURN|BEGIN|END|MAIN|INT|REAL
IDENTIFIER =[a-zA-Z_][a-zA-Z0-9_]*
%state COMMENT
%%
{KEYWORDS}
{
    System.out.println("keyword is .. " + yytext());
}
{IDENTIFIER}
{
    System.out.println("ID is .." + yytext());
}


\r\n|.|\n {}

Может ли кто-нибудь дать какой-нибудь намек или предложение о том, как: 1. обнаружить комментарии (в формате / * * /) 2. подсчитывать каждое вхождение идентификаторов, ключевых слов и т. Д.

1 Ответ

1 голос
/ 01 марта 2011

Вы создали метод main, вы также можете создать переменные-члены для вашего лексера в файле lex:

%{
private int keywordCount = 0;
public static void main(String argv[]) throws java.io.IOException
{
        MyLexer yy= new MyLexer(new FileReader("input"));
        while( yy.yylex() >= 0);
}
%}

Затем вы можете увеличить ключевое словоCount в коде, связанном с KEYWORDS:

{KEYWORDS}
{
System.out.println("keyword is .. " + yytext());
++keywordCount;
}

Обнаружение комментариев звучит как основная задача для этого домашнего задания, поэтому я оставлю это вам;)

но я скажу вам, что вы должны изучить состояния LEX / JFlex. Вы обнаружите / * и затем перейдете в состояние комментария. Когда вы обнаружите * /, находясь в состоянии комментария, вы выйдете из состояния комментария.

...