packages feed

verismith-1.1.0: src/Verismith/Verilog/Lex.x

-- -*- haskell -*-
{
{-# OPTIONS_GHC -w #-}
module Verismith.Verilog.Lex
  ( alexScanTokens
  ) where

import Verismith.Verilog.Token

}

%wrapper "posn"

-- Numbers

$nonZeroDecimalDigit = [1-9]
$decimalDigit = [0-9]
@binaryDigit  = [0-1]
@octalDigit   = [0-7]
@hexDigit     = [0-9a-fA-F]

@decimalBase = "'" [dD]
@binaryBase  = "'" [bB]
@octalBase   = "'" [oO]
@hexBase     = "'" [hH]

@binaryValue         = @binaryDigit ("_" | @binaryDigit)*
@octalValue  = @octalDigit  ("_" | @octalDigit)*
@hexValue    = @hexDigit    ("_" | @hexDigit)*

@unsignedNumber = $decimalDigit ("_" | $decimalDigit)*

@size = @unsignedNumber

@decimalNumber
  = @unsignedNumber
  | @size? @decimalBase @unsignedNumber

@binaryNumber = @size? @binaryBase @binaryValue
@octalNumber  = @size? @octalBase  @octalValue
@hexNumber    = @size? @hexBase    @hexValue
 
-- $exp  = [eE]
-- $sign = [\+\-]
-- @realNumber = unsignedNumber "." unsignedNumber | unsignedNumber ( "." unsignedNumber)? exp sign? unsignedNumber
@number = @decimalNumber | @octalNumber | @binaryNumber | @hexNumber

-- Strings

@string = \" [^\r\n]* \"

-- Identifiers

@escapedIdentifier = "\" ($printable # $white)+ $white
@simpleIdentifier  = [a-zA-Z_] [a-zA-Z0-9_\$]*
@systemIdentifier = "$" [a-zA-Z0-9_\$]+


tokens :-

  "always"           { tok KWAlways     }
  "assign"           { tok KWAssign     }
  "begin"            { tok KWBegin      }
  "case"             { tok KWCase       }
  "default"          { tok KWDefault    }
  "else"             { tok KWElse       }
  "end"              { tok KWEnd        }
  "endcase"          { tok KWEndcase    }
  "endmodule"        { tok KWEndmodule  }
  "for"              { tok KWFor        }
  "if"               { tok KWIf         }
  "initial"          { tok KWInitial    }
  "inout"            { tok KWInout      }
  "input"            { tok KWInput      }
  "integer"          { tok KWInteger    }
  "localparam"       { tok KWLocalparam }
  "module"           { tok KWModule     }
  "negedge"          { tok KWNegedge    }
  "or"               { tok KWOr         }
  "output"           { tok KWOutput     }
  "parameter"        { tok KWParameter  }
  "posedge"          { tok KWPosedge    }
  "reg"              { tok KWReg        }
  "wire"             { tok KWWire       }
  "signed"           { tok KWSigned     }

  @simpleIdentifier  { tok IdSimple             }
  @escapedIdentifier { tok IdEscaped            }
  @systemIdentifier  { tok IdSystem             }

  @number            { tok LitNumber            }
  @string            { tok LitString            }

  "("                { tok SymParenL            }
  ")"                { tok SymParenR            }
  "["                { tok SymBrackL            }
  "]"                { tok SymBrackR            }
  "{"                { tok SymBraceL            }
  "}"                { tok SymBraceR            }
  "~"                { tok SymTildy             }
  "!"                { tok SymBang              }
  "@"                { tok SymAt                }
  "#"                { tok SymPound             }
  "%"                { tok SymPercent           }
  "^"                { tok SymHat               }
  "&"                { tok SymAmp               }
  "|"                { tok SymBar               }
  "*"                { tok SymAster             }
  "."                { tok SymDot               }
  ","                { tok SymComma             }
  ":"                { tok SymColon             }
  ";"                { tok SymSemi              }
  "="                { tok SymEq                }
  "<"                { tok SymLt                }
  ">"                { tok SymGt                }
  "+"                { tok SymPlus              }
  "-"                { tok SymDash              }
  "?"                { tok SymQuestion          }
  "/"                { tok SymSlash             }
  "$"                { tok SymDollar            }
  "'"                { tok SymSQuote            }

  "~&"               { tok SymTildyAmp          }
  "~|"               { tok SymTildyBar          }
  "~^"               { tok SymTildyHat          }
  "^~"               { tok SymHatTildy          }
  "=="               { tok SymEqEq              }
  "!="               { tok SymBangEq            }
  "&&"               { tok SymAmpAmp            }
  "||"               { tok SymBarBar            }
  "**"               { tok SymAsterAster        }
  "<="               { tok SymLtEq              }
  ">="               { tok SymGtEq              }
  ">>"               { tok SymGtGt              }
  "<<"               { tok SymLtLt              }
  "++"               { tok SymPlusPlus          }
  "--"               { tok SymDashDash          }
  "+="               { tok SymPlusEq            }
  "-="               { tok SymDashEq            }
  "*="               { tok SymAsterEq           }
  "/="               { tok SymSlashEq           }
  "%="               { tok SymPercentEq         }
  "&="               { tok SymAmpEq             }
  "|="               { tok SymBarEq             }
  "^="               { tok SymHatEq             }
  "+:"               { tok SymPlusColon         }
  "-:"               { tok SymDashColon         }
  "::"               { tok SymColonColon        }
  ".*"               { tok SymDotAster          }
  "->"               { tok SymDashGt            }
  ":="               { tok SymColonEq           }
  ":/"               { tok SymColonSlash        }
  "##"               { tok SymPoundPound        }
  "[*"               { tok SymBrackLAster       }
  "[="               { tok SymBrackLEq          }
  "=>"               { tok SymEqGt              }
  "@*"               { tok SymAtAster           }
  "(*"               { tok SymParenLAster       }
  "*)"               { tok SymAsterParenR       }
  "*>"               { tok SymAsterGt           }

  "==="              { tok SymEqEqEq            }
  "!=="              { tok SymBangEqEq          }
  "=?="              { tok SymEqQuestionEq      }
  "!?="              { tok SymBangQuestionEq    }
  ">>>"              { tok SymGtGtGt            }
  "<<<"              { tok SymLtLtLt            }
  "<<="              { tok SymLtLtEq            }
  ">>="              { tok SymGtGtEq            }
  "|->"              { tok SymBarDashGt         }
  "|=>"              { tok SymBarEqGt           }
  "[->"              { tok SymBrackLDashGt      }
  "@@("              { tok SymAtAtParenL        }
  "(*)"              { tok SymParenLAsterParenR }
  "->>"              { tok SymDashGtGt          }
  "&&&"              { tok SymAmpAmpAmp         }

  "<<<="             { tok SymLtLtLtEq          }
  ">>>="             { tok SymGtGtGtEq          }

  $white             ;

  .                  { tok Unknown              }

{
tok :: TokenName -> AlexPosn -> String -> Token
tok t (AlexPn _ l c) s = Token t s $ Position "" l c
}