diff --git a/README.rst b/README.rst
index d26f2d7..0fead9d 100644
--- a/README.rst
+++ b/README.rst
@@ -186,6 +186,7 @@ ASDL
 
               -- BoolOp() can use left & right?
         expr = BoolOp(boolop op, expr* values)
+             | NamedExpr(expr target, expr value)
              | BinOp(expr left, operator op, expr right)
              | UnaryOp(unaryop op, expr operand)
              | Lambda(arguments args, expr body)
diff --git a/gast/gast.py b/gast/gast.py
index 11b248a..a745858 100644
--- a/gast/gast.py
+++ b/gast/gast.py
@@ -133,6 +133,9 @@ _nodes = (
     ('BoolOp', (('op', 'values',),
                 ('lineno', 'col_offset', 'end_lineno', 'end_col_offset',),
                 (expr,))),
+    ('NamedExpr', (('target', 'value',),
+                ('lineno', 'col_offset', 'end_lineno', 'end_col_offset',),
+                (expr,))),
     ('BinOp', (('left', 'op', 'right',),
                ('lineno', 'col_offset', 'end_lineno', 'end_col_offset',),
                (expr,))),

diff --git a/tests/test_compat.py b/tests/test_compat.py
index c04c433..bca7683 100644
--- a/tests/test_compat.py
+++ b/tests/test_compat.py
@@ -112,6 +112,16 @@ class CompatTestCase(unittest.TestCase):
                         "], type_ignores=[])")
                 self.assertEqual(gast.dump(tree), norm)
 
+            def test_NamedExpr(self):
+                code = '(x := 1) '
+                tree = gast.parse(code)
+                compile(gast.gast_to_ast(tree), '<test>', 'exec')
+                norm = ("Module(body=[Expr(value=NamedExpr(target=Name(id='x',"
+                        " ctx=Store(), annotation=None, type_comment=None), "
+                        "value=Constant(value=1, kind=None)))], type_ignores="
+                        "[])")
+                self.assertEqual(gast.dump(tree), norm)
+
         else:
 
             def test_Bytes(self):

gast doesn't seem to parse assignment expressions correctly
It looks like `gast` doesn't correctly parse [assignment expressions](https://docs.python.org/3/whatsnew/3.8.html#assignment-expressions) (the `:=` operator):

`ast`:

```
In [1]: import ast

In [2]: expr = "(x := 1)"

In [3]: ast.dump(ast.parse(expr))
Out[3]: "Module(body=[Expr(value=NamedExpr(target=Name(id='x', ctx=Store()), value=Constant(value=1, kind=None)))], type_ignores=[])"
```

`gast`:

```
In [4]: import gast

In [5]: expr = "(x := 1)"

In [6]: gast.dump(gast.parse(expr))
Out[6]: 'Module(body=[Expr(value=None)], type_ignores=[])'
```
tests/test_compat.py::CompatTestCase::test_NamedExpr
tests/test_compat.py::CompatTestCase::test_ArgAnnotation tests/test_compat.py::CompatTestCase::test_Call tests/test_compat.py::CompatTestCase::test_Ellipsis tests/test_compat.py::CompatTestCase::test_ExtSlice tests/test_compat.py::CompatTestCase::test_ExtSliceEllipsis tests/test_compat.py::CompatTestCase::test_ExtSlices tests/test_compat.py::CompatTestCase::test_FormattedValue tests/test_compat.py::CompatTestCase::test_Index tests/test_compat.py::CompatTestCase::test_JoinedStr tests/test_compat.py::CompatTestCase::test_KeywordOnlyArgument tests/test_compat.py::CompatTestCase::test_PosonlyArgs tests/test_compat.py::CompatTestCase::test_Raise tests/test_compat.py::CompatTestCase::test_TryExcept tests/test_compat.py::CompatTestCase::test_TryExceptNamed tests/test_compat.py::CompatTestCase::test_TryFinally tests/test_compat.py::CompatTestCase::test_TypeIgnore tests/test_compat.py::CompatTestCase::test_With tests/test_compat.py::CompatTestCase::test_keyword_argument tests/test_compat.py::CompatTestCase::test_star_argument