aboutsummaryrefslogtreecommitdiffstats
path: root/src/VeriFuzz/Verilog/Lex.x
blob: cc67ecc6ac43355edd1139190b41979fcaf9f693 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
-- -*- haskell -*-
{
{-# OPTIONS_GHC -w #-}
module VeriFuzz.Verilog.Lex
  ( alexScanTokens
  ) where

import VeriFuzz.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
}