我正在尝试为以下示例csv找到一个语法:
a; test;test ;
;a; test;test ;
<ignore>; <ignore> ;test
a; <ignore> test;test
a; this is test ;test
Run Code Online (Sandbox Code Playgroud)
分号用作分隔符.仅包含文本的单元格<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')*;
Run Code Online (Sandbox Code Playgroud)
但是使用我的测试用例
@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());
}
}
Run Code Online (Sandbox Code Playgroud)
我看到IGNORE_VALUE规则不匹配<ignore>.解析器似乎使用TEXT_VALUE规则作为起始空格.
为了<ignore>正确解析值,我需要做什么?
这里的问题是词法分析器执行最长的匹配。由于您的 TEXT 终端几乎可以匹配任何内容,因此它会被选中。
我建议只包含文本列并进行“此列是否被忽略?”的分析。在后期阶段,例如验证和突出显示。
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |