找到csv语法的问题,其中单元格具有特殊含义

时间:2015-09-09 08:48:48

标签: csv grammar xtext

我试图找到以下示例csv的语法:

a; test;test ;
;a; test;test ;
<ignore>; <ignore> ;test
a; <ignore> test;test
a; this is test ;test

分号用作分隔符。仅包含文本<ignore>的单元格具有特殊含义,应在EMF模型中由它们自己的类型表示。但是<igonore> test并不是一个特殊的值。必须忽略分号周围的空格。单元格可以包含除分号之外的任何字符。

到目前为止,我已经提出了这个语法:

grammar com.example.Csv

import "http://www.eclipse.org/emf/2002/Ecore" as ecore
generate impEx "http://www.example.com/Csv

Model:
    valueLine=ValueLine

ValueLine:
    ';'? WHITE_SPACE values+=Value WHITE_SPACE (';' WHITE_SPACE values+=Value WHITE_SPACE)* ';'*;

Value:
    ( (=>'<ignore>') {IGNORE_VALUE} IGNORE_VALUE) | text=TEXT_VALUE;

terminal TEXT_VALUE:
    (!';')*;

IGNORE_VALUE:
    '<ignore>';

WHITE_SPACE:
    (' '|'\t')*;

但是使用我的测试用例

@InjectWith(CsvInjectorProvider.class)
@RunWith(XtextRunner.class)
public class ParserTest {

    @Inject
    private ParseHelper<Model> parser;

    @Test
    public void parseDomainmodel() throws Exception {
        Model parsed = parser.parse("abc;  <ignore>;  <ignore> \t;  <ignore> a;def");
        System.out.println(parsed.getValueLine().getValues());
    }
}

我发现IGNORE_VALUE规则与<ignore>不匹配。解析器似乎使用TEXT_VALUE规则作为起始空格。

为了正确解析<ignore>值,我需要做什么?

2 个答案:

答案 0 :(得分:0)

我看到你正在处理你的语法文件中的正则表达式,试试下面的内容:

IGNORE_VALUE:
    '\<ignore\>';

如果你正在处理空格,它应该是这样的:

IGNORE_VALUE:
    '\ *\<ignore\>';

希望这有帮助。

答案 1 :(得分:0)

这里的问题是Lexer执行最长的匹配。由于您的TEXT终端几乎可以匹配,因此可以选择它。

我建议只有文本列并进行分析“这列被忽略了吗?”在后期阶段,如验证和突出显示。