- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个忘恩负义的任务来修复旧的antlr2解析器中的错误,该解析器用于解析edifact文件。不幸的是,我对antlr2或解析器不太熟悉,我无法让它工作。
edifact 文件如下所示:
ABC+Name+Surname+zip+city+street+country+1961219++0037141008'
XYZ+Company+++XYZ+zip+street'
LMN+20081010+1100'
有几个不同的段,它们以关键字开头。例如。 XYZ 或 ABC。关键字后跟不同的属性值,全部用“+”分隔。属性值可以为空。每个段都以 ' 结尾。
问题是,只要数据属性包含关键字,解析器就会抛出错误:
意外 token :XYZ
XYZ+公司+++XYZ+zip+街道'
这是语法文件的摘录:
// $ANTLR 2.7.6
xyz: "XYZ" ELT_SEP!
(xyz1_1a:ANUM|xyz1_1b:NUM) {lq(90,xyz1_1a,xyz1_1b,"XYZ1-1"+LQ90)}? ELT_SEP!
(xyz1_2a:ANUM|xyz1_2b:NUM)? {lq_(90,xyz1_2a,xyz1_2b,"XYZ1-2"+LQ90)}? ELT_SEP!
(xyz1_3a:ANUM|xyz1_3b:NUM)? {lq_(90,xyz1_3a,xyz1_3b,"XYZ1-3"+LQ90)}? ELT_SEP!
(xyz2a:ANUM|xyz2b:NUM)? {lq_(3,xyz2a,xyz2b,"XYZ2"+LQ3)}? ELT_SEP!
(xyz3a:ANUM|xyz3b:NUM)? {lq_(6,xyz3a,xyz3b,"XYZ3"+LQ6)}? ELT_SEP!
(xyz4a:ANUM|xyz4b:NUM) {lq(30,xyz4a,xyz4b,"XYZ4"+LQ30)}?
(ELT_SEP! (xyz5a:ANUM|xyz5b:NUM)?)? {lq_(46,xyz5a,xyz5b,"XYZ5"+LQ46)}? SEG_TERM!
{
if (skipNachricht()) return;
Xyz xyz = new Xyz();
xyz.xyz1_1 = getText(nn(xyz1_1a, xyz1_1b));
xyz.xyz1_2 = getText(nn(xyz1_2a, xyz1_2b));
xyz.xyz1_3 = getText(nn(xyz1_3a, xyz1_3b));
xyz.xyz2 = getText(nn(xyz2a, xyz2b));
xyz.xyz3 = getText(nn(xyz3a, xyz3b));
xyz.xyz4 = getText(nn(xyz4a, xyz4b));
xyz.xyz5 = getText(nn(xyz5a, xyz5b));
handleXyz(xyz);
}
;
/*
* Lexer
*/
class EdifactLexer extends Lexer;
options {
k=2;
filter=true;
charVocabulary = '\3'..'\377'; // Latin
}
DEZ_SEP: ','
{
//System.out.println("Found dez_sep: " + getText());
}
;
ELT_SEP: '+'
{
//System.out.println("Found elt_sep: " + getText());
}
;
SEG_TERM: '\''
{
// System.out.println("Found seg_term: " + getText());
}
;
NUM: (('0'..'9')+ (',' ('0'..'9')+)? ('+' | '\''))
=> ('0'..'9')+ (',' ('0'..'9')+)?
{
//System.out.println("num_: " + getText());
}
|
((ESCAPED | ~('?' | '+' | '\'' | ',' | '\r' | '\n'))+ )
=> ( ESCAPED | ~('?' | '+' | '\'' | ',' | '\r' | '\n'))+
{
$setType(ANUM);
//System.out.println("anum: " + getText());
}
|
(WRONGLY_ESCAPED) => WRONGLY_ESCAPED
{$setType(WRONGLY_ESCAPED); }
;
protected
WRONGLY_ESCAPED: '?' ~('?' | ':' | '+' | '\'' | ',')
{
//System.out.println("Found wrong_escaped: " + getText());
}
;
protected
ESCAPED: '?'
( ',' {$setText(","); }
| '?' {$setText("?"); }
| '\'' {$setText("'"); }
| ':' {$setText(":"); }
| '+' {$setText("+"); }
)
{
//System.out.println("Found escaped: " + getText());
}
;
NEWLINE : ( "\r\n" // DOS
| '\r' // MAC
| '\n' // Unix
)
{ newline();
$setType(Token.SKIP);
}
;
非常感谢任何帮助:)。
最佳答案
这可能不是最好的解决方案,但我终于找到了解决我的问题的方法。因此,如果有人遇到类似问题,这就是我的解决方案:
我编写了一个方法,如果当前 token 类型与我的任何关键字匹配,则将 token 类型更改为 ANUM:
void ckt() throws TokenStreamException, SemanticException {
if (mKeywordList.contains(LT(1).getType())) {
LT(1).setType(ANUM);
}
}
在尝试访问 ANUM-Token 之前,在我的解析器规则中调用该方法:
xyz: "XYZ" ELT_SEP!
{ckt();}(xyz1_1a:ANUM|xyz1_1b:NUM) {lq(90,xyz1_1a,xyz1_1b,"XYZ1-1"+LQ90)}? ELT_SEP!
{ckt();}(xyz1_2a:ANUM|xyz1_2b:NUM)? {lq_(90,xyz1_2a,xyz1_2b,"XYZ1-2"+LQ90)}? ELT_SEP!
{ckt();}(xyz1_3a:ANUM|xyz1_3b:NUM)? {lq_(90,xyz1_3a,xyz1_3b,"XYZ1-3"+LQ90)}? ELT_SEP!
{ckt();}(xyz2a:ANUM|xyz2b:NUM)? {lq_(3,xyz2a,xyz2b,"XYZ2"+LQ3)}? ELT_SEP!
{ckt();}(xyz3a:ANUM|xyz3b:NUM)? {lq_(6,xyz3a,xyz3b,"XYZ3"+LQ6)}? ELT_SEP!
{ckt();}(xyz4a:ANUM|xyz4b:NUM) {lq(30,xyz4a,xyz4b,"XYZ4"+LQ30)}?
(ELT_SEP! {ckt();}(xyz5a:ANUM|xyz5b:NUM)?)? {lq_(46,xyz5a,xyz5b,"XYZ5"+LQ46)}? SEG_TERM!
{
if (skipNachricht()) return;
Xyz xyz = new Xyz();
xyz.xyz1_1 = getText(nn(xyz1_1a, xyz1_1b));
xyz.xyz1_2 = getText(nn(xyz1_2a, xyz1_2b));
xyz.xyz1_3 = getText(nn(xyz1_3a, xyz1_3b));
xyz.xyz2 = getText(nn(xyz2a, xyz2b));
xyz.xyz3 = getText(nn(xyz3a, xyz3b));
xyz.xyz4 = getText(nn(xyz4a, xyz4b));
xyz.xyz5 = getText(nn(xyz5a, xyz5b));
handleXyz(xyz);
}
;
关于java - 当属性值包含关键字时尝试使用 antlr2 解析 edifact 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57388351/
我刚开始阅读 EDI FACT 消息。只是陷入对释放字符的理解(?)。 从谷歌得到这个定义 This is a single character, which overrides the meanin
我们是一家使用现代技术(如 XML 接口(interface))的现代公司,但我们的许多客户都希望我们提供 EDIFACT 格式(如 D96A)的电子发票。 不,我们不能使用现有的库,因为它们不是用我
我们需要为客户处理一些 EDI 消息,我想知道你们中是否有人可以推荐一些可以完成任务的组件(不一定是免费的)。 我对可以将 EDI 消息解析为 .NET 结构和某种传输协议(protocol)(SMT
我使用 EDIFACT 消息并开发了许多工具来帮助我解析和提取原始文件格式的相关信息。 我一直在努力解决的问题是呈现原始的 EDIFACT。我通常只是将消息复制到 Microsoft Word 中,查
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我正在尝试使用 java 映射 EDIFACT 文件。 我使用的数据已编码,如下所示:UNBIATB11AMS135682300687X 我期待这种格式:UNH+1+SBRRES:09:3:1A' 谁
我有一个忘恩负义的任务来修复旧的antlr2解析器中的错误,该解析器用于解析edifact文件。不幸的是,我对antlr2或解析器不太熟悉,我无法让它工作。 edifact 文件如下所示: ABC+N
我正在 EDIFACT 和 X12 中寻找至少一个示例文件,分别显示 二元 shell 。 EDIFACT 应该包括包裹在 UNO/UNP 段中的数据,而 X12 需要使用二进制段 BIN 或 BDS
我在从通过 EDI 发送的 .txt 文件检索交货日期时遇到问题。 我的客户有机会在 .txt 文件中设置该行: 'DTM+76:20160702:102 当他们从网站订购商品时,为将来的交货设置交货
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在开发一个可以通过邮件发送 EDIFACT 消息的应用程序。发送和接收邮件没有问题,接收 EDIFACT 消息(由另一个应用程序发送)也可以。 EDIFACT 是一种发送企业间信息(例如发票)的标
是否有任何开源 java 库可以解析 ANSI X12 和 UN/EDIFACT 标准的 EDI 文件?我找到了 smooks (http://www.smooks.org),它支持 UN/EDIFA
我是一名优秀的程序员,十分优秀!