JFlex - как распарсить присваивание
От: av239 Россия http://alexeivasin.com
Дата: 07.06.12 06:38
Оценка:
Пишу с помощью JFlex парсер php.ini файлов, лексер в данный момент выглядит так. При этом возникает проблема, что в ini файлах после знака = может стоять пустая строчка, и мой лексер считает следующую строчку присваиваевым значением. Как можно это исправить?
Re: JFlex - как распарсить присваивание
От: xBlackCat Россия  
Дата: 13.06.12 06:24
Оценка:
Здравствуйте, av239.
Вы писали:

A> Пишу с помощью JFlex парсер php.ini файлов, лексер в данный момент выглядит так. При этом возникает проблема, что в ini файлах после знака = может стоять пустая строчка, и мой лексер считает следующую строчку присваиваевым значением. Как можно это исправить?


Я бы взял за основу лексер, приведённый в статье Developing Custom Language Plugins for IntelliJ IDEA
Синтаксис файлов .properites и php.ini практически идентичен: задо заменить только символ начала строкового комментария и отключить перенос строк в значении

Думаю, получится так:
  Скрытый текст
package com.intellij.lang.properties.parsing;

import com.intellij.lexer.FlexLexer;
import com.intellij.psi.tree.IElementType;

%%

%class _PropertiesLexer
%implements FlexLexer
%unicode
%function advance
%type IElementType
%eof{  return;
%eof}

CRLF= \n | \r | \r\n
WHITE_SPACE_CHAR=[\ \n\r\t\f]
VALUE_CHARACTER=[^\n\r\f\\] | "\\"{CRLF} |  "\\".
END_OF_LINE_COMMENT=("#"|"!")[^\r\n]*
END_OF_LINE_COMMENT=("#"|";")[^\r\n]*
KEY_SEPARATOR=[\ \t]*[:=][\ \t]* | [\ \t]+
KEY_SEPARATOR=[\ \t]*=[\ \t]* | [\ \t]+
KEY_CHARACTER=[^:=\ \n\r\t\f\\] | "\\"{CRLF} | "\\".

%state IN_VALUE
%state IN_KEY_VALUE_SEPARATOR

%%

<YYINITIAL> {END_OF_LINE_COMMENT}        { yybegin(YYINITIAL); return PropertiesTokenTypes.END_OF_LINE_COMMENT; }

<YYINITIAL> {KEY_CHARACTER}+             { yybegin(IN_KEY_VALUE_SEPARATOR); return PropertiesTokenTypes.KEY_CHARACTERS; }
<IN_KEY_VALUE_SEPARATOR> {KEY_SEPARATOR} { yybegin(IN_VALUE); return PropertiesTokenTypes.KEY_VALUE_SEPARATOR; }
<IN_VALUE> {VALUE_CHARACTER}+            { yybegin(YYINITIAL); return PropertiesTokenTypes.VALUE_CHARACTERS; }

<IN_KEY_VALUE_SEPARATOR> {CRLF}{WHITE_SPACE_CHAR}*  { yybegin(YYINITIAL); return PropertiesTokenTypes.WHITE_SPACE; }
<IN_VALUE> {CRLF}{WHITE_SPACE_CHAR}*     { yybegin(YYINITIAL); return PropertiesTokenTypes.WHITE_SPACE; }
{WHITE_SPACE_CHAR}+                      { return PropertiesTokenTypes.WHITE_SPACE; }
.                                        { return PropertiesTokenTypes.BAD_CHARACTER; }


И уже от этого момента отталкиваться дальше
Rojac v0.1 / rev. 899
Rojac &mdash; Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.