diff --git a/README.md b/README.md
index 5969b3d..a1085ab 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ The PEG syntax is well described on page 2 in the [document](http://www.brynosau
   * `{ precedence L - + L / * }` (Parsing infix expression)
   * `%recovery(` ... `)` (Error recovery operator)
   * `exp⇑label` or `exp^label` (Syntax sugar for `(exp / %recover(label))`)
-  * `label { message "..." }` (Error message instruction)
+  * `label { error_message "..." }` (Error message instruction)
   * `{ no_ast_opt }` (No AST node optimazation instruction)
 
 'End of Input' check will be done as default. In order to disable the check, please call `disable_eoi_check`.
@@ -566,8 +566,8 @@ NAME        ← < [a-zA-Z_][a-zA-Z_0-9]* >
 %word       ← NAME
 
 # Recovery operator labels
-semia       ← '' { message "missing semicolon in assignment." }
-stmtb       ← (!(Stmt / 'else' / '}') .)* { message "invalid statement" }
+semia       ← '' { error_message "missing semicolon in assignment." }
+stmtb       ← (!(Stmt / 'else' / '}') .)* { error_message "invalid statement" }
 condw       ← &'==' ('==' RelExp)* / &'<' ('<' AddExp)* / (!')' .)*
 ```
 
diff --git a/docs/native.wasm b/docs/native.wasm
index a4f265d..916acfe 100755
Binary files a/docs/native.wasm and b/docs/native.wasm differ
diff --git a/peglib.h b/peglib.h
index a2f2de9..6052c56 100644
--- a/peglib.h
+++ b/peglib.h
@@ -3416,8 +3416,8 @@ private:
     g["PrecedenceAssoc"] <= cls("LR");
 
     // Error message instruction
-    g["ErrorMessage"] <=
-        seq(lit("message"), g["SpacesOom"], g["LiteralD"], g["SpacesZom"]);
+    g["ErrorMessage"] <= seq(lit("error_message"), g["SpacesOom"],
+                             g["LiteralD"], g["SpacesZom"]);
 
     // No Ast node optimazation instruction
     g["NoAstOpt"] <= seq(lit("no_ast_opt"), g["SpacesZom"]);
@@ -3811,7 +3811,7 @@ private:
 
     g["ErrorMessage"] = [](const SemanticValues &vs) {
       Instruction instruction;
-      instruction.type = "message";
+      instruction.type = "error_message";
       instruction.data = std::any_cast<std::string>(vs[0]);
       instruction.sv = vs.sv();
       return instruction;
@@ -4070,7 +4070,7 @@ private:
           if (!apply_precedence_instruction(rule, info, s, log)) {
             return nullptr;
           }
-        } else if (instruction.type == "message") {
+        } else if (instruction.type == "error_message") {
           rule.error_message = std::any_cast<std::string>(instruction.data);
         } else if (instruction.type == "no_ast_opt") {
           rule.no_ast_opt = true;
diff --git a/test/test2.cc b/test/test2.cc
index 0aedd32..33a9cc5 100644
--- a/test/test2.cc
+++ b/test/test2.cc
@@ -1505,7 +1505,7 @@ TEST(ErrorTest, Default_error_handling_fiblang) {
     %whitespace       ← [ \t\r\n]*
     %word             ← [a-zA-Z]
 
-    col ← '' { message "missing colon." }
+    col ← '' { error_message "missing colon." }
   )");
 
   EXPECT_TRUE(!!pg);
@@ -1558,8 +1558,8 @@ WORD       <- < (![ \t\r\n=|[\]#] .)+ >
 comment    <- ('#' (!nl .)*)
 nl         <- '\r'? '\n'
 
-header <- (!__ .)* { message "invalid section header, missing ']'." }
-entry  <- (!(__ / HEADER) .)+ { message "invalid entry." }
+header <- (!__ .)* { error_message "invalid section header, missing ']'." }
+entry  <- (!(__ / HEADER) .)+ { error_message "invalid entry." }
   )");
 
   EXPECT_TRUE(!!pg);
@@ -1737,14 +1737,14 @@ comment    <- ('#' (!nl .)*)
 nl         <- '\r'? '\n'
 
 # Recovery
-duplicate_or     <- skip_puncs { message "Duplicate OR operator (|)" }
-missing_or       <- '' { message "Missing OR operator (|)" }
-missing_bracket  <- skip_puncs { message "Missing opening/closing square bracket" }
-expect_phrase    <- skip { message "Expect phrase" }
-invalid_ope_comb <- skip_puncs { message "Use of invalid operator combination" }
-invalid_ope      <- skip { message "Use of invalid operator" }
-wildcard         <- '' { message "Wildcard characters (%c) should not be used" }
-vernacular_char  <- '' { message "Section name %c must be in English" }
+duplicate_or     <- skip_puncs { error_message "Duplicate OR operator (|)" }
+missing_or       <- '' { error_message "Missing OR operator (|)" }
+missing_bracket  <- skip_puncs { error_message "Missing opening/closing square bracket" }
+expect_phrase    <- skip { error_message "Expect phrase" }
+invalid_ope_comb <- skip_puncs { error_message "Use of invalid operator combination" }
+invalid_ope      <- skip { error_message "Use of invalid operator" }
+wildcard         <- '' { error_message "Wildcard characters (%c) should not be used" }
+vernacular_char  <- '' { error_message "Section name %c must be in English" }
 
 skip             <- (!(__) .)*
 skip_puncs       <- [|=]* _
@@ -1972,8 +1972,8 @@ PRINTLN    ← 'System.out.println'
 %word       ← NAME
 
 # Throw operator labels
-rcblk      ← SkipToRCUR { message "missing end of block." }
-semia      ← '' { message "missing simicolon in assignment." }
+rcblk      ← SkipToRCUR { error_message "missing end of block." }
+semia      ← '' { error_message "missing simicolon in assignment." }
 
 # Recovery expressions
 SkipToRCUR ← (!RCUR (LCUR SkipToRCUR / .))* RCUR
@@ -2058,7 +2058,7 @@ START       <- (LINE (ln LINE)*)? ln?
 
 LINE        <- STR '=' CODE
 
-CODE        <- HEX / DEC { message 'code format error...' }
+CODE        <- HEX / DEC { error_message 'code format error...' }
 HEX         <- < [a-f0-9]+ 'h' >
 DEC         <- < [0-9]+ >