瀏覽代碼

+ support for & and % in char constants, resolves #12186

git-svn-id: trunk@11809 -
florian 17 年之前
父節點
當前提交
69159eb9f3
共有 3 個文件被更改,包括 53 次插入19 次删除
  1. 1 0
      .gitattributes
  2. 41 19
      compiler/scanner.pas
  3. 11 0
      tests/webtbs/tw12186.pp

+ 1 - 0
.gitattributes

@@ -8556,6 +8556,7 @@ tests/webtbs/tw12050a.pp svneol=native#text/plain
 tests/webtbs/tw12050b.pp svneol=native#text/plain
 tests/webtbs/tw12051.pp svneol=native#text/plain
 tests/webtbs/tw1207.pp svneol=native#text/plain
+tests/webtbs/tw12186.pp svneol=native#text/plain
 tests/webtbs/tw1222.pp svneol=native#text/plain
 tests/webtbs/tw1223.pp svneol=native#text/plain
 tests/webtbs/tw1228.pp svneol=native#text/plain

+ 41 - 19
compiler/scanner.pas

@@ -3649,25 +3649,47 @@ In case not, the value returned can be arbitrary.
                      '#' :
                        begin
                          readchar; { read # }
-                         if c='$' then
-                           begin
-                              readchar; { read leading $ }
-                              asciinr:='$';
-                              while (upcase(c) in ['A'..'F','0'..'9']) and (length(asciinr)<6) do
-                               begin
-                                 asciinr:=asciinr+c;
-                                 readchar;
-                               end;
-                           end
-                         else
-                           begin
-                              asciinr:='';
-                              while (c in ['0'..'9']) and (length(asciinr)<6) do
-                               begin
-                                 asciinr:=asciinr+c;
-                                 readchar;
-                               end;
-                           end;
+                         case c of
+                           '$':
+                             begin
+                               readchar; { read leading $ }
+                               asciinr:='$';
+                               while (upcase(c) in ['A'..'F','0'..'9']) and (length(asciinr)<=5) do
+                                 begin
+                                   asciinr:=asciinr+c;
+                                   readchar;
+                                 end;
+                             end;
+                           '&':
+                             begin
+                               readchar; { read leading $ }
+                               asciinr:='&';
+                               while (upcase(c) in ['0'..'7']) and (length(asciinr)<=7) do
+                                 begin
+                                   asciinr:=asciinr+c;
+                                   readchar;
+                                 end;
+                             end;
+                           '%':
+                             begin
+                               readchar; { read leading $ }
+                               asciinr:='%';
+                               while (upcase(c) in ['0','1']) and (length(asciinr)<=17) do
+                                 begin
+                                   asciinr:=asciinr+c;
+                                   readchar;
+                                 end;
+                             end;
+                           else
+                             begin
+                               asciinr:='';
+                               while (c in ['0'..'9']) and (length(asciinr)<=5) do
+                                 begin
+                                   asciinr:=asciinr+c;
+                                   readchar;
+                                 end;
+                             end;
+                         end;
                          val(asciinr,m,code);
                          if (asciinr='') or (code<>0) then
                            Message(scan_e_illegal_char_const)

+ 11 - 0
tests/webtbs/tw12186.pp

@@ -0,0 +1,11 @@
+{$mode objfpc}
+begin
+writeln(13); // ok
+writeln($d); // ok
+writeln(&15); // ok
+writeln(%1101); // ok
+writeln(0000098); // ok
+writeln(#$62); // ok
+writeln(#&142); // error!
+writeln(#%1100010); // error!
+end.