Лексер, который распознает блоки с отступом - PullRequest
5 голосов
/ 01 августа 2011

Я хочу написать компилятор для языка, который обозначает программные блоки с пробелами, как в Python. Я предпочитаю делать это в Python, но C ++ также вариант. Есть ли лексер с открытым исходным кодом, который может помочь мне сделать это легко, например, путем генерации идентификаторов INDENT и DEDENT правильно, как это делает лексер Python? Соответствующий генератор парсера будет плюсом.

Ответы [ 2 ]

4 голосов
/ 01 августа 2011

LEPL - это чистый Python и поддерживает разбор вне игры.

1 голос
/ 01 августа 2011

Если вы используете что-то вроде lex, вы можете сделать это следующим образом:

^[ \t]+              { int new_indent = count_indent(yytext);
                       if (new_indent > current_indent) {
                          current_indent = new_indent;
                          return INDENT;
                       } else if (new_indent < current_indent) {
                          current_indent = new_indent;
                          return DEDENT;
                       }
                       /* Else do nothing, and this way
                          you can essentially treat INDENT and DEDENT
                          as opening and closing braces. */
                     }

Вам может потребоваться дополнительная логика, например, чтобы игнорировать пустые строки и автоматически добавлять DEDENT в конец файла, если это необходимо.

Предположительно count_indent будет учитывать преобразование табуляции в пробелы в соответствии со значением табуляции.

Я не знаю о генераторах лексеров / парсеров для Python, но то, что я написал, должно работать с lex / flex, и вы можете подключить его к yacc / bison для создания парсера. Вы можете использовать C или C ++ с ними.

...