Regex 在flex和bison中使用函数作为参数解析函数

Regex 在flex和bison中使用函数作为参数解析函数,regex,parsing,bison,flex-lexer,Regex,Parsing,Bison,Flex Lexer,我一直在网上看flex和bison教程,试图解决我的问题,因为它们都使用非常简单的示例,而我的示例更复杂。我需要解析一个可能包含如下输入的文件: f(x,g(x)) [f,x,[g,x]] 这些函数也可以有任意数量的参数 问题是,解析器需要将f和g都视为函数,而不是将f作为函数,g作为x的参数。换句话说,我需要这样的输出: f(x,g(x)) [f,x,[g,x]] 而不是像: [f, x, g(x)] 有人能告诉我如何最好地做到这一点,并可能提供正则表达式(因为我对它们不太在行)在词

我一直在网上看flex和bison教程,试图解决我的问题,因为它们都使用非常简单的示例,而我的示例更复杂。我需要解析一个可能包含如下输入的文件:

f(x,g(x))
[f,x,[g,x]]
这些函数也可以有任意数量的参数

问题是,解析器需要将f和g都视为函数,而不是将f作为函数,g作为x的参数。换句话说,我需要这样的输出:

f(x,g(x))
[f,x,[g,x]]
而不是像:

[f, x, g(x)]
有人能告诉我如何最好地做到这一点,并可能提供正则表达式(因为我对它们不太在行)

在词汇(flex)级别,您可以识别四个标记作为标识符:f、x、g和x。在语法(bison)级别,您可以将g(x)和f(x,g(x))识别为表达式。非常简略地说:

expression -> numeric-literal | 
              identifier |
              identifier left-parenthesis arguments right-parenthesis

arguments -> argument | 
             argument comma arguments

argument -> expression
这个小例子将告诉您识别标记和解析之间的区别

您还可以将参数解析为:

arguments -> argument | 
             arguments comma argument
两者之间有一些微妙的区别,可能与你的问题有关,也可能与你的问题无关

在词汇级别识别标识符的正则表达式是您喜欢的。或许

[a-zA-Z][a-zA-Z0-9]*
换句话说,一个字母后跟可选数字和字母

约翰·莱文(John Levine)的《莱克斯与雅克》(lex&yacc)是一本好书。我没有使用过他的flex&bison,,但我会根据前一本书的优点推荐它。

在词汇(flex)级别,您会识别四个标记作为标识符:f、x、g和x。在语法(bison)级别,您可以将g(x)和f(x,g(x))识别为表达式。非常简略地说:

expression -> numeric-literal | 
              identifier |
              identifier left-parenthesis arguments right-parenthesis

arguments -> argument | 
             argument comma arguments

argument -> expression
这个小例子将告诉您识别标记和解析之间的区别

您还可以将参数解析为:

arguments -> argument | 
             arguments comma argument
两者之间有一些微妙的区别,可能与你的问题有关,也可能与你的问题无关

在词汇级别识别标识符的正则表达式是您喜欢的。或许

[a-zA-Z][a-zA-Z0-9]*
换句话说,一个字母后跟可选数字和字母


约翰·莱文(John Levine)的《莱克斯与雅克》(lex&yacc)是一本好书。我没有使用过他的flex&bison,,但我会根据前一本书的优点推荐它。

如果它很简单,可能是递归正则表达式(这是Perl)。我相信,使用一个能彻底解决这个问题的语言解析器可以更好地处理这个问题

$str = 'some stuff  F( g(x), tx, , 44, Y(hh()) , 99, b())';

$open      = '\b\w+\s*';

$regex = qr~
  (                                                 # 1
     ($open)                                        # 2
     [(]
        (                                           # 3                       
           (?:  (?> (?: (?!$open[(] | [)] ) . )+ ) 
              | (?1)                                         
           )*                                               
        )                                                   
     [)]
   )                                                 
~xs;

print "Before:  ", $str, "\n";
print "After:   ", parse_func ( $str ), "\n";

###
sub parse_func {
  my ($core) = @_;
  $core =~ s/$regex/ "[$2," . (parse_func( $3 )) . "]" /eg;
  return $core;
}
输出

Before:  some stuff  F( g(x), tx, , 44, Y(hh()) , 99, b())
After:   some stuff  [F, [g,x], tx, , 44, [Y,[hh,]] , 99, [b,]]

如果它很简单,可能是一个递归正则表达式(这是Perl)。我相信,使用一个能彻底解决这个问题的语言解析器可以更好地处理这个问题

$str = 'some stuff  F( g(x), tx, , 44, Y(hh()) , 99, b())';

$open      = '\b\w+\s*';

$regex = qr~
  (                                                 # 1
     ($open)                                        # 2
     [(]
        (                                           # 3                       
           (?:  (?> (?: (?!$open[(] | [)] ) . )+ ) 
              | (?1)                                         
           )*                                               
        )                                                   
     [)]
   )                                                 
~xs;

print "Before:  ", $str, "\n";
print "After:   ", parse_func ( $str ), "\n";

###
sub parse_func {
  my ($core) = @_;
  $core =~ s/$regex/ "[$2," . (parse_func( $3 )) . "]" /eg;
  return $core;
}
输出

Before:  some stuff  F( g(x), tx, , 44, Y(hh()) , 99, b())
After:   some stuff  [F, [g,x], tx, , 44, [Y,[hh,]] , 99, [b,]]

生成请求的输出时,这不是flex/bison,因为问题是关于@user13733-虽然问题是关于flex/bison的,但我发现公认的解决方案是阅读一本书。这个答案中的正则表达式和生成的输出是OP需要的。因此,与其说是理论讨论,不如说是解决方案委员会。我举了一个例子,在OP读了这本书之后,他可能会看到一些实际的联系,如果不是这样的话,他是不会看到的。请随意发布一个正在工作的flex/bison解决方案。在生成请求的输出时,这不是flex/bison,因为问题具体是关于@user13733-虽然问题具体是关于flex/bison的,但我发现公认的解决方案是阅读一本书。这个答案中的正则表达式和生成的输出是OP需要的。因此,与其说是理论讨论,不如说是解决方案委员会。我举了一个例子,在OP读了这本书之后,他可能会看到一些实际的联系,如果不是这样的话,他是不会看到的。请随意发布一个可行的flex/bison解决方案。