我试图用正则表达式解析一系列psudeo-assembly代码,这些代码的格式如下:
optional_label required_instruction optional_parameter, optional_parameter
实际示例看起来更像:
PRINTLOOP MOV R6, R7
CMP R6, R9
TRP 1
BLK
MOV,CMP,BLK和BRZ是指令。
令牌之间的空格可以是任意数量的空格或制表符,标签必须从行的开头开始,而指令可以从开头开始,也可以有任意数量的前导空格或制表符。
我需要单独获取它的每一位,因此正则表达式正确分组是很重要的。我目前正在尝试使用这种模式:
((?<label>[\w]*)[ |\t]+)?(?<operator>[\w]+)[ |\t]+(?<operand1>[\w]+)?(,[ |\t]*(?<openparen>\()?(?<operand2>[-]*[\w]+)(?<closeparen>\))?)?
这种模式到目前为止一直运行良好,因为总有至少一个参数,但现在我有零参数指令,不适合这个。我试图将模式调整为以下内容:
((?<label>[\w]*)[ |\t]+)?(?<operator>[\w]+)([ |\t]+(?<operand1>[\w]+))?(,[ |\t]*(?<openparen>\()?(?<operand2>[-]*[\w]+)(?<closeparen>\))?)?
因此指令(运算符)之后的空格不是强制性的,但我发现这使得事情变得模糊不清以至于指令被认为是许多指令中的标签。例如:
LDB R0, lM
被理解为标签:LDB,指令:R0,并且两个操作数都不被识别。
他们是一种强制首先检查操作符部分的方法(以便优先处理字符串的那一部分),资源将解释我在这一切中出错的地方,或者是一个正在执行什么操作的正则表达式模式我在找?
答案 0 :(得分:3)
即使在理论上你的问题也无法解决,因为你的语法含糊不清:当你在看时
INC R6
你的语法可以通过以下两种方式解析它:
label=INC, Instruction=R6
或
Instruction=R6, Parameter1=R6
我使用和/或实现的汇编语言通过在可选标签之后要求一列来解决此问题,如下所示:
[label:] instruction [parameter] [, optional_parameter]
这将为你的正则表达式提供一个额外的“锚点”(即冒号:
),通过它可以告诉标签+指令与指令+参数情况。
另一种方法是为说明引入“关键字”,并禁止将这些关键字用作标签。这样可以避免引入冒号,但会使基于正则表达式的解决方案变得不切实际。