查找单元格具有特殊含义的 csv 语法时出现问题
Problems finding a csv grammar where cells have a special meaning
我正在尝试为以下示例 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>
值?
我看到您正在处理语法文件中的正则表达式,请尝试以下操作:
IGNORE_VALUE:
'\<ignore\>';
如果你正在处理空格,它应该是这样的:
IGNORE_VALUE:
'\ *\<ignore\>';
希望对您有所帮助。
这里的问题是 Lexer 执行了最长的匹配。由于您的 TEXT 终端几乎可以匹配任何内容,因此它会被选中。
我建议只包含文本列,并在验证和突出显示等后期阶段对 "is this column ignored?" 进行分析。
我正在尝试为以下示例 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>
值?
我看到您正在处理语法文件中的正则表达式,请尝试以下操作:
IGNORE_VALUE:
'\<ignore\>';
如果你正在处理空格,它应该是这样的:
IGNORE_VALUE:
'\ *\<ignore\>';
希望对您有所帮助。
这里的问题是 Lexer 执行了最长的匹配。由于您的 TEXT 终端几乎可以匹配任何内容,因此它会被选中。
我建议只包含文本列,并在验证和突出显示等后期阶段对 "is this column ignored?" 进行分析。