我目前正在为虚构的汇编语言编写自己的解析器。这些指令与任何普通的汇编指令非常相似:
[INSTRUCTION] [OP]*
其中 op 可以是 0-3 个操作数。我希望能够使用与此匹配的表达式。这是用 boost::regex 用 C++ 编写的。我自己是一个正则表达式新手,试图了解每个符号的作用的 boost 文档。
现在,我已经有了一个可以匹配 0-3 个操作数的表达式,如下所示:
Sample Instructions:
MOVI 8 10
ADDI 8 8 10
NOP
BNEZI -1
Expression: ^([a-z]+)( ([-,0-9]+))*
但是,我无法创建一个合适的表达式来处理以逗号分隔的相同指令:
Sample Instructions:
MOVI 8, 10
ADDI 8, 8, 10
这真让我失望。我试着像这样重写我的表达方式:
^([a-z]+)( ([-,0-9]+))*(, ([-,0-9]+))*
这看起来非常绿色,糟糕的正则表达式。它也无法正常工作。我正在考虑使用递归表达式,但我查看了文档,我还不如在额头上乱写“矫枉过正”。
我意识到我可以只格式化该行以删除所有逗号,但我更希望能够先编写和理解正则表达式,然后再以简单的方式进行。任何帮助将不胜感激。
最佳答案
像这样的字符串:
ADDI 8, 8, 10
可以用这样的正则表达式匹配:
[a-zA-Z]+[ \t]+-?[0-9]+([ \t]*,[ \t]*-?[0-9]+)*
一个(简短的)解释:
[a-zA-Z]+ # match an instruction
[ \t]+ # match one or more spaces or tabs
-?[0-9]+ # match an integer value with an option minus sign in front of it
( # open group 1
[ \t]* # match zero or more spaces or tabs
, # match a comma
[ \t]* # match zero or more spaces or tabs
-?[0-9]+ # match an integer value with an option minus sign in front of it
)* # close group 1, and repeat it zero or more times
说了这么多,我必须同意 dmckee 的评论:正确的解析器是正确的方法,即使这只是您正在解析的虚构语言。
关于c++ - 汇编指令的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5688704/