diff --git a/cimple.cabal b/cimple.cabal
--- a/cimple.cabal
+++ b/cimple.cabal
@@ -1,5 +1,5 @@
 name:          cimple
-version:       0.0.26
+version:       0.0.27
 synopsis:      Simple C-like programming language
 homepage:      https://toktok.github.io/
 license:       GPL-3
diff --git a/src/Language/Cimple/DescribeAst.hs b/src/Language/Cimple/DescribeAst.hs
--- a/src/Language/Cimple/DescribeAst.hs
+++ b/src/Language/Cimple/DescribeAst.hs
@@ -5,10 +5,11 @@
     ( HasLocation (..)
     , describeLexeme
     , describeNode
+    , getLoc
     , parseError
     ) where
 
-import           Data.Fix                (Fix (..), foldFix)
+import           Data.Fix                (Fix (..), foldFix, unFix)
 import           Data.List               (isPrefixOf, (\\))
 import qualified Data.List               as List
 import           Data.Text               (Text)
@@ -31,6 +32,13 @@
         case foldFix Flatten.lexemes n of
             []  -> Text.pack file <> ":0:0"
             l:_ -> sloc file l
+
+
+getLoc :: Node (Lexeme l) -> Lexeme l
+getLoc n =
+    case foldFix Flatten.lexemes n of
+        []  -> error "getLoc: node has no lexemes"
+        l:_ -> l
 
 
 describeNode :: Show a => Node a -> String
diff --git a/src/Language/Cimple/Lexer.x b/src/Language/Cimple/Lexer.x
--- a/src/Language/Cimple/Lexer.x
+++ b/src/Language/Cimple/Lexer.x
@@ -159,6 +159,7 @@
 <0,ppSC>	"tox_"?"bitwise"			{ mkL KwBitwise }
 <0,ppSC>	"tox_"?"force"				{ mkL KwForce }
 <0,ppSC>	"tox_"?"owner"				{ mkL KwOwner }
+<0,ppSC>	"_Owner"				{ mkL KwOwner }
 <0,ppSC>	"break"					{ mkL KwBreak }
 <0,ppSC>	"case"					{ mkL KwCase }
 <0,ppSC>	"const"					{ mkL KwConst }
@@ -312,7 +313,7 @@
 instance Hashable AlexPosn
 
 data Lexeme text = L AlexPosn LexemeClass text
-    deriving (Eq, Show, Generic, Functor, Foldable, Traversable)
+    deriving (Eq, Show, Generic, Functor, Foldable, Traversable, Ord)
 
 instance FromJSON text => FromJSON (Lexeme text)
 instance ToJSON text => ToJSON (Lexeme text)
diff --git a/src/Language/Cimple/Parser.y b/src/Language/Cimple/Parser.y
--- a/src/Language/Cimple/Parser.y
+++ b/src/Language/Cimple/Parser.y
@@ -671,25 +671,33 @@
 :	bitwise ID_STD_TYPE					{ Fix (TyBitwise (Fix (TyStd $2))) }
 |	force leafType						{ Fix (TyForce $2) }
 |	leafType ConstQual					{                              ($2      $1)    }
-|	leafType ConstQual '*' Qual				{                $4 (tyPointer ($2      $1))   }
-|	leafType ConstQual '*' Qual '*' Qual			{ $6 (tyPointer ($4 (tyPointer ($2      $1)))) }
+|	leafType ConstQual '*'					{                (tyPointer ($2      $1))   }
+|	leafType ConstQual '*' QualList				{                $4 (tyPointer ($2      $1))   }
+|	leafType ConstQual '*' QualMaybe '*' QualMaybe		{ $6 (tyPointer ($4 (tyPointer ($2      $1)))) }
 |	const leafType						{                              (tyConst $2)    }
-|	const leafType '*' Qual					{                $4 (tyPointer (tyConst $2))   }
-|	const leafType '*' Qual '*' Qual			{ $6 (tyPointer ($4 (tyPointer (tyConst $2)))) }
+|	const leafType '*' QualMaybe				{                $4 (tyPointer (tyConst $2))   }
+|	const leafType '*' QualMaybe '*' QualMaybe		{ $6 (tyPointer ($4 (tyPointer (tyConst $2)))) }
 
 ConstQual :: { NonTerm -> NonTerm }
 ConstQual
 :								{ id }
 |	const							{ tyConst }
 
+QualList :: { NonTerm -> NonTerm }
+QualList
+:	Qual QualList						{ $1 . $2 }
+|	Qual							{ $1 }
+
+QualMaybe :: { NonTerm -> NonTerm }
+QualMaybe
+:	QualList						{ $1 }
+|								{ id }
+
 Qual :: { NonTerm -> NonTerm }
 Qual
-:								{ id }
-|	const							{ tyConst }
+:	const							{ tyConst }
 |	nonnull							{ tyNonnull }
 |	nullable						{ tyNullable }
-|	nonnull const						{ tyConst . tyNonnull }
-|	nullable const						{ tyConst . tyNullable }
 |	owner							{ tyOwner }
 
 Nullability :: { Nullability }
