0

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

  1. 阅读 Token ADDRESS 到 EOF 之后的所有内容

  2. “ADDRESS TO EOF”之间可以有多个 ADDRESS 令牌(从步骤 1 开始)

我的示例输入如下所示:

...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令牌出现之前跳过所有输入,而不是将所有其他输入放入$$. 谢谢。

4

1 回答 1

1

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

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

这里head匹配 Y 的任何数字(包括 0)匹配XYtail的任何数字(包括 0)。因此,匹配的X必须是输入中的第一个X,并且没有歧义。list

在这种情况下,这里的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;
于 2016-07-25T17:58:49.253 回答