[erlang-questions] leex and yecc spotting double newline

jm jeffm@REDACTED
Mon Mar 23 07:12:06 CET 2009


Say the lexer definition contains, among other things,

Definitions.
W  = [^=\s\r\n]
WS = \s
CR = \r
NL = \n
EQ = =

Rules.
{W}+  : {token, {word, TokenLine, TokenChars}}.
{EQ}  : {token, {eq, TokenLine, TokenChars}}.
{WS}+ : {token, {ws, TokenLine, TokenChars}}.
({CR}|{NL}|{CR}{NL}) : {token, {nl, TokenLine, TokenChars}}.


At the moment, the yecc definition file contains,

  Nonterminals
  request lines line lhs rhs words.
 
  Terminals
  eq word ws nl.

  Rootsymbol request.
  request -> lines : '$1'.

  lines -> line nl : ['$1'].
  lines -> line lines nl : ['$1'] ++ '$3'.

  line -> lhs eq rhs nl : {line, '$1', '$3'}.

  lhs -> word : {lhs, '$1'}.

  rhs -> words : {rhs, '$1'}.

  words -> word : ['$1'].
  words -> word ws words : ['$1', '$2'] ++ '$3'.


and is designed to parse the postfix policy request (see 
http://www.postfix.org/SMTPD_POLICY_README.html)

A couple of questions:

1) What do I put in the yecc file so the it can spot a double newline 
which is used to terminate a request?

2) When parsing the example at the above URL (minus the postfix version 
comments) it seems to have problems with the "sender=foo@REDACTED". Why?

   code used to parse example (based on code from 
http://hopper.squarespace.com/blog/2008/5/29/leex-and-yecc.html ):

  parse(Filename) ->
      {ok, InFile} = file:open(Filename, [read]),
      Acc = loop(InFile, []),
      file:close(InFile),
      postfix_policy_parser:parse(Acc).

  loop(InFile, Acc) ->
      case io:request(InFile, {get_until, prompt, postfix_policy_lexer, 
token, [1]}) of
          {ok, Token, EndLine} ->
              io:format("Token: ~p EndLine: ~p~n", [Token, EndLine]),
              loop(InFile, Acc ++ [Token]);
          {error, token} ->
              exit(scanning_error);
          {eof,_} ->
              Acc
      end.


Of course any other pointers are welcomed.


Jeff.




More information about the erlang-questions mailing list