当前位置: 首页 > 知识库问答 >
问题:

分析以特定关键字开头和结尾的代码块

欧阳睿范
2023-03-14

在这个问题之后,我想解析以特定关键字开头的代码块(例如,<代码>

grammar <garammarName>

// Parser Rules

statement: EndOfStatment;

statement_list: statement+;

section:
    '<firstKeyword>' statement_list End
    | '<secondKeyword>' statement_list End
    | '<thirdKeyword>' statement_list End

sections: section+ EOF;

// Lexer Rules

End: 'End';

NewLine: ('\r'? '\n' | '\n' | '\r') -> skip;

WhiteSpace: [ \t\r\n]+ -> skip;

EndOfStatment: ';' | NewLine;

然而,问题是,当代码块没有以关键字结束时,TestRig/grun工具(指令)不会引发错误。例如,示例代码<代码>

<firstKeyword>
End

<secondKeyword>

<thirdKeyword>
End

不返回任何错误

grun <garammarName> sections -tree < <exampleFile>

如果您能帮助我了解问题以及如何解决,我将不胜感激。

共有1个答案

尚嘉勋
2023-03-14

当我运行类似于您在此处给出的输入时,我得到:

➜ grun ElmerSolver sections -tree  < examples/ex001.sif
line 6:0 missing 'End' at 'Equation'
(sections (section Simulation statement_list End) (section Constants statement_list <missing 'End'>) (section Equation 1 statement_list End) <EOF>)

第6行缺少“End”的错误。(“等式”处的第6:0行缺少“End”)

ANTLR错误恢复确实提供了丢失的“End”来恢复并继续解析,但它会调用错误。

作为参考,这是我使用的完整语法:

grammar ElmerSolver;

// Parser Rules

// eostmt: ';' | CR;

statement: EndOfStatment;

statement_list: statement*;

sections: section+ EOF;
// section: SectionName /* statement_list */ End;

// Lexer Rules

fragment DIGIT: [0-9];
Integer: DIGIT+;

Float:
    [+-]? (DIGIT+ ([.]DIGIT*)? | [.]DIGIT+) ([Ee][+-]? DIGIT+)?;

section:
    'Header' statement_list End                         # headerSection
    | 'Simulation' statement_list End                   # simulatorSection
    | 'Constants' statement_list End                    # constantsSection
    | 'Body' Integer statement_list End                 # bodySection
    | 'Material' Integer statement_list End             # materialSection
    | 'Body Force' Integer statement_list End           # bodyForceSection
    | 'Equation' Integer statement_list End             # equationSection
    | 'Solver' Integer statement_list End               # solverSection
    | 'Boundary Condition' Integer statement_list End   # boundaryConditionSection
    | 'Initial Condition' Integer statement_list End    # initialConditionSection
    | 'Component' Integer statement_list End            # componentSection;

End: 'End';

// statementEnd: ';' NewLine*;

NewLine: ('\r'? '\n' | '\n' | '\r') -> skip;

LineJoining:
    '\\' WhiteSpace? ('\r'? '\n' | '\r' | '\f') -> skip;

WhiteSpace: [ \t\r\n]+ -> skip;

LineComment: '#' ~( '\r' | '\n')* -> skip;

EndOfStatment: ';' | NewLine;

((我为您更改了EndOfStatement规则)

这是我使用的输入文件

Simulation
End

Constants 

Equation 1
End

这是我使用-guigrun选项获得的图形视图;

回复:您使用“结束状态”规则进行的更改。

EndofStatement可能应该是一个解析器规则(小写)。

此外,根据语法,“n”将始终被识别为带有-

使用-tokens选项运行grun,您将不会看到任何EndOfStatement标记。(除非在源文件中添加“;”。)

➜ grun ElmerSolver sections -tree -tokens < examples/ex001.sif
[@0,0:9='Simulation',<'Simulation'>,1:0]
[@1,11:13='End',<'End'>,2:0]
[@2,16:24='Constants',<'Constants'>,4:0]
[@3,28:35='Equation',<'Equation'>,6:0]
[@4,37:37='1',<Integer>,6:9]
[@5,39:41='End',<'End'>,7:0]
[@6,42:41='<EOF>',<EOF>,7:3]
line 6:0 missing 'End' at 'Equation'
(sections (section Simulation statement_list End) (section Constants statement_list <missing 'End'>) (section Equation 1 statement_list End) <EOF>)

如果您希望换行符在语法上具有重要意义(即,您可以在语法中使用它),则需要删除-

然而,一旦这样做了,就必须明确新行有效的所有位置(但我看到了您的换行标记,所以看起来这应该有一点Python的感觉,所以这可能就是您想要的)。(相同的注释回复:<代码>-

 类似资料:
  • 问题内容: 在CSS中,如何选择所有元素开头和结尾的元素? 例如,我想选择并应用以下样式: 问题答案: 以下CSS3选择器将完成此工作: 该表示什么应该开始。 该表示什么应该结束。 本身可以用另一个属性替换,例如,应用于时(例如):

  • 如何编写由字符组成但必须以相同字母开头和结尾的正则表达式?例如:

  • 我在外壳脚本中有一个变量$var1。如果我做,我将得到例如波士顿值。我想要的值是 我试过几个案子: 但在这两种情况下,我都得到了结果,,但我想要请不要提及包含Boston的解决方案。如果您能在整个脚本中只使用,我将不胜感激,这样它就更清晰了!“Boston”只需要是脚本执行的输出,并用于变量var1的初始化。 谢谢

  • 我在记事本中加载了一个非常大的源代码文件,我试图使用它的regex搜索功能来查找所有使用属性的地方。 我需要找到设置属性<code>DESCR</code>的所有位置。我尝试只搜索没有正则表达式,但有太多的结果需要我筛选。我知道我正在寻找的代码要么以或

  • 是否可以使用关键字分析器从https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-keyword-analyzer.html在搜索? 我想要在文本字段中分析特定字符串。

  • 具有 您可以轻松地在python中读取YAML文件,但它没有得到在末尾我到达错误(与): 但YAML规范允许: YAML使用三个破折号(“--”)将指令与文档内容分开。如果没有指令,这也可以作为文档开始的信号。三个点(“…”)指示文档的结束,但不启动新文档,用于通信通道。 那么,你怎么看这个 在python中?