【问题标题】:Parsing boolean expression without left hand recursion在没有左手递归的情况下解析布尔表达式
【发布时间】:2013-03-08 12:24:17
【问题描述】:

我正在尝试匹配这个

f(some_thing) == 'something else'
  • f(some_thing)是函数调用,是表达式
  • == 是一个布尔运算符
  • 'something else'是一个字符串,也是一个表达式

所以布尔表达式应该是

expression operator expression

问题是如果没有左递归,我无法弄清楚如何做到这一点 这是我的规则

expression 
  = 
  bool_expression
  / function_call
  / string
  / real_number
  / integer
  / identifier

bool_expression
  = l:expression space* op:bool_operator space* r:expression 
  { return ... }

使用语法符号,我有

O := ==|<=|>=|<|>|!=  // operators
E := B|....           // expression, many non terminals
B := EOE

因为我的语法是 EOE,所以我不知道如何使用左手算法

A := Ab|B
transforms into
A := BA'
A':= e|bA

其中 e 为空,b 为终端

【问题讨论】:

    标签: parsing grammar peg pegjs


    【解决方案1】:

    应该这样做:

    expression
     = bool_expression
    
    bool_expression
     = add_expression "==" bool_expression
     / add_expression "!=" bool_expression
     / add_expression
    
    add_expression
     = mult_expression "+" add_expression
     / mult_expression "-" add_expression
     / mult_expression
    
    mult_expression
     = atom "*" mult_expression
     / atom "/" mult_expression
     / atom
    
    atom
     = function_call 
     / string
     / real_number
     / integer
     / identifier
    
    function_call
     = identifier "(" (expression ("," expression)*)? ")"
    
    string
     = "'" [^']* "'"
    
    identifier
     = [a-zA-Z_]+
    
    integer
     = [0-9]+
    
    real_number
     = integer "." integer?
     / "." integer
    

    【讨论】:

    • 谢谢你的好先生,这行得通!我确实在这个答案之前找到了怎么做,并且正要发布它,但你做得很棒:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多