JISON递归在令牌后读取整个输入文本

时间:2016-07-25 12:13:57

标签: parsing bison context-free-grammar jison

我对解析器/ cfg或jison非常陌生。我希望我的语法要做的是:

  1. 在令牌ADDRESS到EOF之后读取所有内容

  2. “ADDRESS TO EOF”之间可以存在多个ADDRESS令牌(来自步骤1)

  3. 我的示例输入如下:

    ...abc xyz address 101 My Street, Austin, CO 12345 is abc xyz my name is govind my address is 102 My Street,Austin, CO 12345 and here it is end of file.
    

    我期待的输出是

    address 101 My Street, Austin, CO 12345 is abc xyz my name is govind my address is 102 My Street,Austin, CO 12345 and here it is end of file.`
    

    我正在尝试的代码是

    /* lexical grammar */
    
    %lex
    %options flex
    
    %{
    if (!('chars' in yy)) {
       yy.temp = 0;
    }
    
    
    %}
    %%
    \s+                   /* skip whitespace */ 
    (address|Address)      return 'ADDRESS'
    <<EOF>>                return 'EOF'
    [A-Za-z0-9]+           return 'VARIABLE'
    .                     /*skip */
    
    /lex
    
    %start expressions
    %% /* language grammar */
    
    expressions
       : other EOF
        {return $1;}
    
       ;
    
    other
      :VARIABLE{$$=$1;}  
      |other ADDRESS other {$$=$1+"-"+$2+"-"+$3;} 
      ;
    

    我认为应该有更多的表达式来实现输出,因为other ADDRESS other会引发S / R冲突。任何人都可以建议我如何在出现第一个ADDRESS令牌之前跳过所有输入,而不是将所有其他输入放在$$中。 感谢。

1 个答案:

答案 0 :(得分:1)

作为一般原则,当您只想识别 X Y 列表中的第一个 X 时,您需要类似的东西这样:

list: head X tail;
tail: | tail X | tail Y;
head: | head Y;

此处head匹配 Y 的任意数字(包括0),tail匹配 X 或<的任何数字(包括0) EM>ÿ。因此,list匹配的 X 必须是输入中的第一个 X ,并且没有歧义。

在这种情况下,此处tail非终端是不必要的,但生成正确的解析树通常很有用。你可以写上面的语法:

list: head X | list X | list Y;
head: | head Y;

如果您还希望匹配不带任何 X 的列表,则可以添加作品list: head

list: head | head X tail;
tail: | tail X | tail Y;
head: | head Y;