c++ - 汇编指令的正则表达式

标签 c++ regex boost

我目前正在为虚构的汇编语言编写自己的解析器。这些指令与任何普通的汇编指令非常相似:

[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/

相关文章:

c++ - Hermite 曲线中的切线值

javascript - 我如何使用正则表达式来提取以下标记?

regex - Perl 多行字符串正则表达式

c++ - boost 相当于memcpy?

c++ - 将 asio read_some 转换为异步版本

c++ - 将集合与集合集合进行比较的最佳算法

c++ - directshow架构风格

c++ - BOOST_NO_EXCEPTIONS 是否保证与 -fno-exceptions 兼容?

c++ - 是否可以在 C++14 中分配和验证 constexpr 结构?

javascript - 正则表达式获取 API 表单 URL 的版本