我的任务是为供应商使用的过滤语言创建一个linter。
示例过滤器将是:
({HL7:MSH.21-1} != 'ADT')
and
({HL7:MSH.4-1} != 'TRI')
and
(
or ({HL7:MSH.21-1} == 'LAB')
or ({HL7:MSH.21-1} == 'RAD')
or ({HL7:MSH.21-1} == 'TRN')
)
我已成功将其拆分为令牌:
[$, (, {, HL7, :, MSH, ., 21, -, 1, }, !=, ', ADT, ', ), $, and, $, (, {, HL7, :, MSH, ., 4, -, 1, }, !=, ', TRI, ', ), $, and, $, (, $, or, (, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', LAB, ', ), $, or, (, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', RAD, ', ), $, or, (, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', TRN, ', ), $, )]
用$
表示新行。
我也在括号和括号中阻止它:
[(, {, HL7, :, MSH, ., 21, -, 1, }, !=, ', ADT, ', )]
[{, HL7, :, MSH, ., 21, -, 1, }]
[(, {, HL7, :, MSH, ., 4, -, 1, }, !=, ', TRI, ', )]
[{, HL7, :, MSH, ., 4, -, 1, }]
[(, $, or, (, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', LAB, ', ), $, or, (, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', RAD, ', ), $, or, (, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', TRN, ', ), $, )]
[(, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', LAB, ', )]
[{, HL7, :, MSH, ., 21, -, 1, }]
[(, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', RAD, ', )]
[{, HL7, :, MSH, ., 21, -, 1, }]
[(, {, HL7, :, MSH, ., 21, -, 1, }, ==, ', TRN, ', )]
[{, HL7, :, MSH, ., 21, -, 1, }]
问题是,有些东西不包括在括号或括号中,因此被排除在块之外。
例如:和
我需要一种方法来将块与完整的令牌列表进行比较,并返回其中的任何内容。
我能想到的最好的事情就是以某种方式将所有小清单与大清单进行比较并找到匹配项,无论匹配得到什么都被拉出来,但我不知道如何去做。