在下列情况下,我应该使用正则表达式还是自上而下的LL(1)解析器?

时间:2017-12-25 11:43:14

标签: java parsing lexer

我需要解析飞行计划文档以提取相关信息。下面给出了一份样本文件:

(FPL-REU974-IS
-B77L/H-SDE1E2E3GFHIJ4J5M1RWXYZ/LB1D1
-LFPG1845
-N0490F310 OKASI UL612 MILPA UM730 TOP UL50 ELB UL12 VELAD UM728 NERAR UP3
RCA/N0489F350 UR611 TIKAT UG300 MAV UM665G ITLOX UM665 UVESO/N0486F370 DCT DENLI
UR780 MIDRI UR780G UVENA
-FMEE1036 FIMP
-PBN/A1D1L1S1 NAV/RNP10 DOF/121114 REG/FOLRA EET/LSAS0039 LFFF0039 LIMM0048 LIRR0111
LMMM0218 HLLL0237 HECC0343 HSSS0425 HAAA0545 HKNA0700 HCSM0701 FSSS0745 FMMM0900
SEL/CGFR ORGN/RUKOUU PER/C SRC/RQP RMK/ADSB ACARS EQUIPPED TCAS EQUIPPED)

如上图所示。飞行计划信息包含在()之间。第一行包含FPL"关键字",飞机识别码(REU974)和航班类型(IS)(-用作分隔符)

以下几行包含有关航班的其他信息,例如出发机场和时间(第3行,LFPG1845),航行点(第4行),到达机场和时间(第5行)等等。

我正在考虑两种方法来解析这些数据:

  • 使用正则表达式从文档中提取相关信息。
  • 编写一个自上而下的LL(1)递归下降词法分析器和解析器,并将flightplan文档视为" DSL"各种各样的。

在后一种情况下,我会写一个词法分析器,它会返回(-/\nnumber等代币, word。这些令牌将由解析器完成,以便从飞行计划中提取相关信息。解析器还将验证输入。例如,在第一行中,飞机识别长度不超过7个字符,并且飞行类型只能包含来自给定集合的字符。

与使用正则表达式相比,上一种方法是否会过度杀伤?

考虑到我需要解析数以千计的飞行计划,这也是最有效的方法,我需要快速实现这一点。

编辑:实现语言是Java

0 个答案:

没有答案